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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值