如何在不按值(副本)将参数传递给 fmt 的情况下打印 go?
也许是这样的(假设的 * 标志)?
fmt.Printf( "Value of pointer %*s", &mystruct.somelargestring )
目前:
fmt.Printf( "val is %v, %v\n", &mystruct.val, mystruct.Val )
val is 0xf84061d170, somestring
最佳答案
我知道你问的原因是你担心打印大字符串时的内存和性能问题,因为你相信会制作一个副本并将其传递给 fmt.Printf 函数。
在这种情况下,您不必担心这一点,因为保存字符串数据的字节数组的副本不会传递给函数。
在 Go 中,字符串是一个只读字节 slice ,因此传递给函数的只是一个只读字节 slice 。
go 中的 slice 是一个值,它包含对数组元素( slice [0] 处的元素)的引用,其中包括 slice 的长度及其容量(有关更多信息,请参见下面的链接 slice 的深入解释)。
重要的是要了解 slice 不保存数据(字符串的实际字节)——它只保存对该数据的引用。
对于字符串, slice 是只读的,您不能直接访问底层数组。
因此,由于您的字符串变量包含一个 slice 而不是底层数组,并且 slice 只是对该数组的引用,因此当您调用 fmt.Printf 函数时,您传递的是一个引用。
当然,Go 中的所有内容都是按值传递的,但是由于您传递的是一个包含对数组的引用的值,因此不会创建底层数组的副本;只生成包含对底层数组的引用的值的副本,这很便宜,因此您可以使用:
fmt.Printf( "%s", mystruct.somelargestring )
没有制作大字符串的任何副本。
为了澄清以上内容,阅读以下内容会对您有所帮助:
http://blog.golang.org/go-slices-usage-and-internals
和
Go 语言规范也会有所帮助。
关于go - 通过引用 fmt 传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25747225/