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]
