package main import ( "fmt" ) /* 值傳遞 函數的【形式參數】是對【實際參數】的值拷貝 所有對地址中內容的修改都與外界的實際參數無關 所有基本數據類型作為參數時,都是值傳遞 */ func ChangeBaseValue(v int) { fmt.Printf("main: v address=%p\n",&v) v *= 2 //函數返回時所有局部變量(此處包含形式參數v)都被釋放了 } /* 引用傳遞(地址傳遞) 函數的【形式參數】記錄的是【實際參數】的地址 所有對地址中內容的修改都會直接改變外界的實際參數 */ func ChangeBaseValuePtr(v *int) { fmt.Printf("main: v address=%p\n",v) *v *= 2 } type Person struct { Age int } /* 結構體的值傳遞 形式參數p是對實際參數zhangsan的值拷貝 對p做任何事情都不會對zhangsan產生任何影響 p是函數執行過程中產生的局部變量,函數執行完畢就釋放 */ func ChangeObjectValue(p Person) { fmt.Printf("ChangeObjectValue:p address=%p\n", &p) p.Age *= 2 //函數返回時所有局部變量(此處包含形式參數v)都被釋放了 } /* 結構體的引用傳遞(地址傳遞) 形式參數p記錄的是實際參數zhansan的內存地址 對p中的內容做任何修改都是對zhangsan的直接修改 p是函數執行過程中產生的局部變量,函數執行完畢就釋放 */ func ChangeObjectValuePtr(p *Person) { fmt.Printf("ChangeObjectValue:p address=%p\n", p) p.Age *= 2 //函數返回時所有局部變量(此處包含形式參數v)都被釋放了 } /* 數組作為形參:值傳遞 切片和map:現有內容/元素都是引用傳遞 */ func ChangeContainerValue(array [3]int, slice []int, mMap map[string]int) { fmt.Printf("ChangeContainerValue:array[0] address=%p\n",&array[0]) fmt.Printf("ChangeContainerValue:slice[0] address=%p\n",&slice[0]) fmt.Printf("ChangeContainerValue:map address=%p\n",mMap) array[0] = 100 slice[0] = 200 mMap["老大"] = 300 } func ChangeContainerValuePtr(array *[3]int, slice *[]int, mMap *map[string]int) { (*array)[0] = 100 (*slice)[0] = 200 (*mMap)["老大"] = 300 *slice = append(*slice, 4) (*mMap)["老四"] = 4 } /*基本類型的值傳遞與引用傳遞*/ func main021() { var a = 10 fmt.Printf("main: a address=%p\n",&a) ChangeBaseValue(a) fmt.Printf("main: a address=%p\n",&a) fmt.Println(a) ChangeBaseValuePtr(&a) fmt.Printf("main: a address=%p\n",&a) fmt.Println(a) } /*結構體的值傳遞與引用傳遞*/ func main022() { zhangsan := Person{Age: 10} fmt.Printf("main: zhangsan address=%p\n", &zhangsan) //ChangeObjectValue(zhangsan) ChangeObjectValuePtr(&zhangsan) fmt.Println(zhangsan.Age) } func main() { var array = [3]int{1,2,3} slice := make([]int, 0) slice = append(slice, 1, 2, 3) mMap := make(map[string]int) mMap["老大"] = 1 mMap["老二"] = 2 mMap["老三"] = 3 fmt.Printf("main:array[0] address=%p\n",&array[0]) fmt.Printf("main:slice[0] address=%p\n",&slice[0]) fmt.Printf("main:map address=%p\n",mMap) //ChangeContainerValue(array, slice, mMap) ChangeContainerValuePtr(&array, &slice, &mMap) fmt.Println(array) fmt.Println(slice) fmt.Println(mMap) }
輸出:
main:array[0] address=0xc0000102e0 main:slice[0] address=0xc000010300 main:map address=0xc000062240 [100 2 3] [200 2 3 4] map[老大:300 老二:2 老三:3 老四:4]