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