总的来说Go的函数只有一种传递方式,就是值传递。将一个变量作为参数传递时,都会创建一个新的变量副本并将其传递给所调用的函数,副本分配在不同的内存地址,在指针传递变量的情况下,将创建指向相同内存地址的新副本。
package main
import (
"fmt"
)
type self struct {
Name string
}
func (s self) self_change_name(name string){ //值传递 拷贝一份self
s.Name = name
}
func (s *self) police_station_change_name(name string){ //指针传递 指向self
s.Name = name
}
func main() {
s := self{"A"} // 初始化A
s.self_change_name("B") //改成B,但并未生效
fmt.Println(s.Name)
s.police_station_change_name("C")
fmt.Println(s.Name)
}
# 结果
A
C
在Go中值传递通常开销比指针较小,这是因为Go使用逃逸分析来确定变量是否可以安全地分配到函数的栈帧上,可能比在堆上分配变量开销小的多,通过值传递可以简化Go中的逃逸分析,并为变量提供更好的分配机会。如果变量是一个大的结构,性能是一个问题,最好是通过指针传递变量。这样可以避免在内存中复制整个结构。如非特殊情况下建议还是使用值传递。