Go 的引用型別

littlexiaoshuishui發表於2020-06-01

廢話不多說,先看一段簡化的程式碼

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 協議》,轉載必須註明作者和本文連結

相關文章