go的函数传参默认是值类型,想要按引用传参,那么需要的就是传指针,go的传指针类似于c++的传引用,指针并不能改变,因为指针的地址也是按值传递的.看测试代码如下:
package main
import (
"fmt"
)
type foo struct {
a int
}
func update1(f foo){
f.a=2
}
func update2(f *foo) *foo{
f.a=2
var otherf foo
otherf.a=3
f=&otherf
return &otherf
}
func main() {
var f foo
f.a=1
update1(f)
fmt.Println(f.a)
otherf := update2(&f)
fmt.Println(f.a)
fmt.Println(otherf.a)
}
(1)在调用update1之后,f的打印依然是1,说明函数是按值传递的
(2)在调用update2之后,f的打印是2,说明指针是好用的,打印的不是3,说明对f=&otherf不能生效,因为*foo的参数传入的是f的地址是值传递,而在update2中对于地址的任何操作都是局部操作,不会对main函数的f的地址造成影响
(3)otherf是update2的局部变量,通过函数返回值传出后,go会自动延长其生命周期,可以正确的在main中打印出3的值.
总结,update2的函数形式,是go的常见的函数的写法.