假如有一個(gè)變量:
var a int = 0
這時(shí)要通過一個(gè)函數(shù)set改變a的值:
func set (a int){
a = 1
}
在main函數(shù)中調(diào)用:
func main(){
var a int = 0
set(a)
fmt.Println(a)
}
最終a的結(jié)果還是0。
這是因?yàn)閭鬟f到set方法中的是a變量值得拷貝:
var a int = 0//假設(shè)a變量地址為 0xc00005e1b0
set(a)//這里實(shí)際傳遞的是set(0)
//在set函數(shù)中
func set (a int){
//a的變量地址為0xc00005e1d1阻课,注意與外面的a不是一個(gè)地址艰匙,這是兩個(gè)變量
//這一行改變的實(shí)際上是0xc00005e1d1 這個(gè)地址的值
a = 1
}
看看內(nèi)存中的情況:
如何解決這個(gè)問題员凝?在Golang中只需要傳遞指針即可,對(duì)上面的代碼做出修改:
var a int = 0
set(&a) //這里變成&a
func set(a *int){//這里變成a *int
*a = 1//這里變成*a=1
}
再來看看內(nèi)存中的情況:
注意:
一定要是*a =1
這才意味著改變的是a對(duì)應(yīng)地址指向的值
如果是a =1
首先肯定編譯不通過旺上,因?yàn)閍變量需要指向的是一個(gè)地址糖埋,而1不是地址。
其次如果a(里面的)=另外一個(gè)地址瞳别,那么外面a還是不會(huì)變化:
使用時(shí)一定要注意細(xì)節(jié),一不留神就出問題疤坝。
原創(chuàng),如有雷同純屬偶合跑揉。