这是很多Go开发者的误区,喜欢用户指针传递而非值传递,想当然认为指针传递比值传递的速度快,因为减少了内存拷贝。你是否也是这样觉得呢?
如果你这样觉得可能是受 C语言的影响,在C语言里面指针传递的确比值传递效率高,但Go 确不一定,因为Go是一门带 gc 的语言。当你向函数传递指针的时候,Go 需要执行逃逸分析确定变量应该存储在堆上还是栈上,这就需要消耗大量时间。退一步说,即便对象是放在堆上面,那么堆内存 gc 的回收也需要消耗时间。所以在Go里面指针传递未必比值传递更快。通常取决于对象大小,如果对象本身很大的情况下,指针传递的确会稍好一点,但如果小对象,使用值传递速度快。
如果大家对分析Go 逃逸分析感兴趣的可以在编译的时候执行
go build -gcflags="-m"
如果输出里面有 ”escapes to heap“ 就说明逃逸到堆上了。
其实Go里面很多时候并不需要,除非需要修改 struct 内部数据,譬如需要修改name的内容,如下:
func (p *person) rename(s string) {
p.name = s
}
func (p *person) printName() {
fmt.Println(p.name)
}
很多时候并不一定需要指针传递。
页面更新:2024-05-19
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号