go的函数传参和指针

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的常见的函数的写法.

猜你喜欢

转载自blog.csdn.net/dong_beijing/article/details/81712795