Go語言中傳入與返回參數在調用和返回時都使用值傳遞,這里需要注意的是指針、切片和 map 等引用型對象在參數傳遞中不會發生復制,而是將指針進行復制,類似於創建一次引用。
程序實例:
package main import "fmt" type Data struct { complax []int //測試切片在參數傳遞的效果 instance InnerData //實例分配的innerData ptr *InnerData //將ptr聲明為InnerData的指針類型 } //代表各種結構體 type InnerData struct { a int } func passByValue(inFunc Data) Data { //輸出參數成員情況 fmt.Printf("inFunc value:%+v \n", inFunc) //打印inFunc 指針 fmt.Printf("inFunc value:%p \n", &inFunc) return inFunc } func main() { in := Data{ complax: []int{1, 2, 3}, //注意逗號不能少,否則報錯 instance: InnerData{ 5, //注意逗號不能少,否則報錯 }, ptr: &InnerData{1}, //注意逗號不能少,否則報錯,這里是值傳遞,指針地址不變 } //輸出結構成員情況 fmt.Printf("in value: %+v \n", in) //輸出結構成員指針情況 fmt.Printf("in value指針值: %p\n", &in) //傳入結構體,返回同類型結構體 out := passByValue(in) //輸出結構成員情況 fmt.Printf("out value %+v \n", out) //輸出結構成員指針情況 fmt.Printf("out value指針值: %p\n", &out) }
程序輸出:
in value: {complax:[1 2 3] instance:{a:5} ptr:0xc00000a0b0} in value指針值: 0xc00005e330 inFunc value:{complax:[1 2 3] instance:{a:5} ptr:0xc00000a0b0} inFunc value:0xc00005e3c0 out value {complax:[1 2 3] instance:{a:5} ptr:0xc00000a0b0} out value指針值: 0xc00005e390