通过引用fmt传递参数

时间:2014-09-09 14:29:04

标签: go

如何在不通过值(副本)传递参数的情况下打印到fmt?

也许是这样的(假设的*旗帜)?

fmt.Printf( "Value of pointer %*s", &mystruct.somelargestring )

目前:

fmt.Printf( "val is %v, %v\n", &mystruct.val, mystruct.Val )
val is 0xf84061d170, somestring

2 个答案:

答案 0 :(得分:1)

我理解您提出要求的原因是您在打印大字符串时担心内存和性能问题,因为您认为将创建副本并将其传递到fmt.Printf函数。

在这种情况下,您不必担心,因为保存字符串数据的字节数组的副本不会传递给函数。

在Go中,字符串是只读字节片,因此传递给函数的只是 - 只读字节片。

go中的切片是一个值,它保存对数组元素(slice [0]处的元素)的引用,其中包括切片的长度及其容量(请参阅下面的链接以获取更多信息)切片的深入解释)。

重要的是要理解切片不包含数据(字符串的实际字节) - 它只保存对该数据的引用。

对于字符串,切片是只读的,您无法直接访问基础数组。

因此,由于您的字符串变量包含切片而不是基础数组,并且切片只是对该数组的引用,因此当您调用fmt.Printf函数时,您将传递引用。

Go中的所有东西都是通过值传递的,当然,但是因为你传递的是一个包含对你数组的引用的值,所以底层数组的副本不会被创建;只有保存对底层数组的引用的值的副本,这是便宜的,所以你可以使用:

fmt.Printf( "%s", mystruct.somelargestring )

没有制作大字符串的任何副本。

为了澄清上述内容,您可以阅读:

http://blog.golang.org/go-slices-usage-and-internals

http://blog.golang.org/slices

Go语言规范也会有所帮助。

答案 1 :(得分:0)

如果使用指针,fmt.Printf将使用指针的副本(“指针值”的副本),而不是对象本身的副本。
Calls

  

在函数调用中,函数值和参数按通常顺序计算   在评估它们之后,调用的参数将按值传递给函数,并且被调用的函数开始执行。

我通常使用:

myobject *MyObject
fmt.Printf("%v", myObject)