Go語言的傳值與傳引用


Go語言里的傳值與傳引用大致與C語言中一致,但有2個特例,map和channel默認傳引用,也就是說可以直接修改傳入的參數,其他的情況如果不用指針的話,傳入的都是參數的副本,在函數中修改不會改變調用者中的變量值。簡單的做了一個例子:

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
}

結果輸出:

Hello from Go start
sVal:
sRef:sRef
dVal:
dRef:dRef
sRet:sRet
dRet:dRet
mVal[mVal]:mVal
mRef[mRef]:mRef
Hello from Go end

驗證了官方的說法。可見萬變不離其宗,編程無他,唯手熟爾。

學習知識的法則: 學習 + 實踐 + 思考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM