go指針的坑--go指針做爲參數沒法改地址

go裏面只有值傳遞,沒有引用傳遞函數

go裏面只有值傳遞,沒有引用傳遞spa

go裏面只有值傳遞,沒有引用傳遞指針

這個就意味着你無論傳什麼東西進去,都是傳的一個拷貝,就算你傳進函數的是一個指針!!!blog

例如:class

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)
}

這個獲得的結果是:test

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語言指針,對都怪它,和個人菜沒有半毛錢關係。import

由於這個傳進去的指針,其實並非把指針自己傳進去了,而是傳了一個指針的拷貝,就是那個參數實際上是另外一個指針,只是指的地址和你傳進去的指針一致引用

就像:im

你入參的實際上是a copy,因此你操做函數中的a的指向地址,其實只是改變了a copy的地址db

就像:

因此函數外部的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

搞定!

相關文章
相關標籤/搜索