Go语言值传递和指针传递(引用传递)
Admin
2019-05-07 10:59:47
GoLang
总的来说Go的函数只有一种传递方式,就是值传递。将一个变量作为参数传递时,都会创建一个新的变量副本并将其传递给所调用的函数,副本分配在不同的内存地址,在指针传递变量的情况下,将创建指向相同内存地址的新副本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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) } |
1 2 3 | # 结果 A C |
在Go中值传递通常开销比指针较小,这是因为Go使用逃逸分析来确定变量是否可以安全地分配到函数的栈帧上,可能比在堆上分配变量开销小的多,通过值传递可以简化Go中的逃逸分析,并为变量提供更好的分配机会。如果变量是一个大的结构,性能是一个问题,最好是通过指针传递变量。这样可以避免在内存中复制整个结构。如非特殊情况下建议还是使用值传递。