GO語言基礎---值傳遞與引用傳遞


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]

  


免責聲明!

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



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