go语言自增变量测试

今天突然间看到一个问题,记录一下整个的分析过程

func incr(t int){
	t++
}

func main() {
	p :=1
	incr(p)
	fmt.Println(p)
}

输出: 1
原因:
1.定义一个int类型的变量p
2.将p变量传入到incr函数中
3.在incr函数中对该变量进行自增,其实这步传进来后跟p就没有一毛钱关系了,所以p该是啥还是啥
那我们再变一下:

func incr(t *int){
	*t++
}

func main() {
	p :=1
	incr(&p)
	fmt.Println(p)
}

输出:2
原因:
1.将变量p的地址传入incr函数
2.在函数内部对该地址进行运算,其实也就是从这个地址进行取值,然后对值进行自增,也就是说直接对地址下的值进行了修改,所以输出为2
那我们再看下面这个:

func incr(t int) int{
	t++
	return t
}

func main() {
	p :=1
	incr(p)
	fmt.Println(p)
}

输出:1
其实这个跟第一个差不多,只过是在函数上面加了个返回值,问题是函数都返回了,都没接收,肯定还是1呀,道理跟第一个一样
接着再变一下:

func incr(t int) int{
	t++
	return t
}

func main() {
	p :=1
	i:=incr(p)
	fmt.Println(i)
}

输出:2
原因:
1.同样先定义一个变量p
2.将p作为参数传递给incr函数
3.此时t的值即为变量p的值,最后返回t的值,所以输出为2

总结:
1.不管函数怎么处理只要传入的参数是不带地址的,而且函数没有返回值的,爱咋改咋改,跟我没有一毛钱关系
2.传入的参数是带地址的,无论函数有没有返回值,因为改了地址对应的值,所以改了之后值就直接变了
3.传入的参数不带地址的,函数有返回值的,只要函数的返回值被接收了,那接收的就是改了之后的值

其实从这里可以看出一个问题:只要是对参数数据进行修改的,直接传地址肯定会改变的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值