go - 通过引用 fmt 传递参数

标签 go

如何在不按值(副本)将参数传递给 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

http://blog.golang.org/slices

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

关于go - 通过引用 fmt 传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25747225/

相关文章:

json - 在 go websocket 服务器上获取 json 数据

go - 在 Go 中执行二进制时获取输入

dynamic - 动态加载包

git - 如何指定 `go get` 将使用哪个 ssh key

go - Sqlx "missing destination name"通过指针获取结构标签

go - 扇入 channel 至单 channel

unit-testing - 如何在golang中模拟方法以通过测试

api - 如何使用engine-api观看docker事件

go - 如何从源代码手动安装 Go 包

go - Cobra cli 无法初始化新工具