我如何在不按值(副本)将参数传递给fmt的情况下进行打印?
也许像这样(假想的*标志)?
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中,字符串是只读 byte slice ,因此传递给函数的内容就是-只读 byte 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
和
http://blog.golang.org/slices
Go语言规范也将有所帮助。
关于go - 通过引用传递参数给fmt,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25747225/