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
搞定!