go指针的坑--go指针作为参数无法改地址

go里面只有值传递,没有引用传递

go里面只有值传递,没有引用传递

go里面只有值传递,没有引用传递

这个就意味着你不管传什么东西进去,都是传的一个拷贝,就算你传进函数的是一个指针!!!

例如:

package main

import (
	"fmt"
)

func main() {
	a := new(int)
	fmt.Printf("a outptr = %x,a value = %d\n",a,*a)
	test(a)
	fmt.Printf("a outptr = %x,a value = %d\n",a,*a)
}

func test(a *int){
	b:=5
	fmt.Printf("a in ptr = %x,a value = %d\n",a,*a)
	a=&b
	fmt.Printf("a in ptr = %x,a value = %d\n",a,*a)
}

这个得到的结果是:

a outptr = 416020,a value = 0
a in ptr = 416020,a value = 0
a in ptr = 416024,a value = 5
a outptr = 416020,a value = 0

大写的懵逼有没有,这个都怪C语言指针,对都怪它,和我的菜没有半毛钱关系。

因为这个传进去的指针,其实并不是把指针本身传进去了,而是传了一个指针的拷贝,就是那个参数其实是另一个指针,只是指的地址和你传进去的指针一致

就像:

你入参的其实是a copy,所以你操作函数中的a的指向地址,其实只是改变了a copy的地址

就像:

所以函数外部的a不会有任何变动

那么要怎么才可以改变呢?很简单,把地址改变,变为地址存储的值改变

例如:

package main

import (
	"fmt"
)

func main() {
	a := new(int)
	fmt.Printf("a outptr = %x,a value = %d\n",a,*a)
	test(a)
	fmt.Printf("a outptr = %x,a value = %d\n",a,*a)
}

func test(a *int){
	b:=5
	fmt.Printf("a in ptr = %x,a value = %d\n",a,*a)
	*a=b
	fmt.Printf("a in ptr = %x,a value = %d\n",a,*a)
}

执行结果:

a outptr = 416020,a value = 0
a in ptr = 416020,a value = 0
a in ptr = 416020,a value = 5
a outptr = 416020,a value = 5

搞定!

 

转载于:https://www.cnblogs.com/codedoge/p/9895081.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值