golang值傳遞和引用傳遞


一、值傳遞和引用傳遞區別

package main

import (
	"fmt"
)

func main() {
	// map
	m := make(map[int]string)
	m[0] = "a"
	m[1] = "b"
	changeMap(m)
	fmt.Printf("map:%+v", m)  //輸出 map:map[0:aaa 1:b]
	fmt.Println()

	//array
	var a = [2]string{"a", "b"}
	changeArray(a)
	fmt.Printf("array:%+v", a) //輸出array:[a b]
	fmt.Println()

	//slice
	var s = []string{"a", "b"}
	changeSlice(s)
	fmt.Printf("slice:%+v", s) //輸出slice:[aaa b]
}

func changeMap(m map[int]string) {
	m[0] = "aaa"
}

func changeArray(a [2]string) {
	a[0] = "aaa"
}

func changeSlice(s []string) {
	s[0] = "aaa"
}

二、結構體傳遞指針或者值

1、值傳遞

package main

type T struct{
	Value 		int
}

func main(){
	myT := T{Value:666}

	change(myT)

	println(myT.Value)

}
func change(t T){
	t.Value = 999

程序的輸出是 666 ,因為這種方法傳遞的是值一個副本,在change() 函數中,你實際上修改的是副本的值

2、指針傳遞

package main

type T struct{
	Value 		int
}

func main(){
	myT := T{Value:666}

	change(&myT)

	println(myT.Value)

}
func change(t *T){
	t.Value = 999
} 

這段程序使用了&取地址操作符來獲取結構體的地址,而change()函數期望一個T結構體的地址類型 *T,這里*T的意思是指向類型T值得指針;

程序運行輸出 999

 


免責聲明!

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



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