Go語(yǔ)言的傳值與傳引用
Go語(yǔ)言里的傳值與傳引用大致與C語(yǔ)言中一致,但有2個(gè)特例,map和channel默認(rèn)傳引用,也就是說(shuō)可以直接修改傳入的參數(shù),其他的情況如果不用指針的話,傳入的都是參數(shù)的副本,在函數(shù)中修改不會(huì)改變調(diào)用者中的變量值。簡(jiǎn)單的做了一個(gè)例子:
package main
import "fmt"
func main() {
fmt.Println("Hello from Go start")
var sVal string
var sRef string
var dVal []byte
var dRef []byte
var mVal map[string]string = make(map[string]string, 1)
var mRef map[string]string = make(map[string]string, 1)
sRet, dRet := paramsTest(sVal, &sRef, dVal, &dRef, mVal, &mRef)
fmt.Printf("sVal:%s\n", sVal)
fmt.Printf("sRef:%s\n", sRef)
fmt.Printf("dVal:%s\n", string(dVal))
fmt.Printf("dRef:%s\n", string(dRef))
fmt.Printf("sRet:%s\n", string(sRet))
fmt.Printf("dRet:%s\n", string(dRet))
var k, v string
for k, v = range mVal {
fmt.Printf("mVal[%s]:%s\n", k, v)
}
for k, v = range mRef {
fmt.Printf("mRef[%s]:%s\n", k, v)
}
fmt.Println("Hello from Go end")
}
func paramsTest(sVal string, sRef *string, dVal []byte, dRef *[]byte, mVal map[string]string, mRef *map[string]string) (sRet string, dRet []byte) {
sVal = "sVal"
*sRef = "sRef"
dVal = []byte("dVal")
*dRef = []byte("dRef")
sRet = "sRet"
dRet = []byte("dRet")
mVal["mVal"] = "mVal"
(*mRef)["mRef"] = "mRef"
return sRet, dRet
}
結(jié)果輸出:
Hello from Go start sVal: sRef:sRef dVal: dRef:dRef sRet:sRet dRet:dRet mVal[mVal]:mVal mRef[mRef]:mRef Hello from Go end
驗(yàn)證了官方的說(shuō)法。可見(jiàn)萬(wàn)變不離其宗,編程無(wú)他,唯手熟爾。
學(xué)習(xí)知識(shí)的法則: 學(xué)習(xí) + 實(shí)踐 + 思考
posted on 2014-04-03 22:16 拾貝雜苑 閱讀(2715) 評(píng)論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)