廢話不多說,先看一段簡化的程式碼
func main() {
m := make(map[int]int)
m[1]=1
change(m)
fmt.Println(m)
}
func change(m map[int]int){
m[1] = 100
}
最終列印出來的結果
E:\go\projectOne\blog>go run main.go
map[1:100]
雖然我們傳遞的是一個map變數給函式處理,列印出來後發現m已經被函式修改。類似於引用傳遞的效果。
這是由於Go的引用資料型別的結果
值型別
基本資料型別,int,float,bool,string,以及陣列和struct 特點:變數直接儲存值,記憶體通常在棧中分配,棧在函式呼叫完會被釋放
type User struct {
Age int
}
func main() {
var user User
user.Age = 11
change(user)
fmt.Println(user) //{11}
}
func change(user User){ //值拷貝
user.Age = 100
}
引用型別
變數儲存的是一個地址,這個地址儲存最終的值。記憶體通常在 堆上分配。通過GC回收。
引用型別: 指標、slice切片、管道channel、介面interface、map、函式等
func main() {
m := make(map[int]int)
m[1]=1
change(m)
fmt.Println(m) //map[1:100]
}
func change(m map[int]int){ //也是值拷貝,只是拷貝的是地址,相當於引用處理
m[1] = 100
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結