一、值類型和引用類型
值類型:int、float、bool和string這些類型都屬於值類型,使用這些類型的變量直接指向存在內存中的值,值類型的變量的值存儲在棧中。當使用等號=將一個變量的值賦給另一個變量時,如 j = i ,實際上是在內存中將 i 的值進行了拷貝。可以通過 &i 獲取變量 i 的內存地址。 值拷貝
引用類型:特指slice、map、channel這三種預定義類型。引用類型擁有更復雜的存儲結構:(1)分配內存 (2)初始化一系列屬性等一個引用類型的變量r1存儲的是r1的值所在的內存地址(數字),或內存地址中第一個字所在的位置,這個內存地址被稱之為指針,這個指針實際上也被存在另外的某一個字中。
兩者的主要區別:拷貝操作和函數傳參。
二、實例詳解值類型和引用類型
數組array和切片slice的實例:
定義了一個數組a,它是值類型,復制給b是copy,當b發生變化后a並不會發生任何變化,程序的執行結果如下所示:
//由 main 函數作為程序入口點啟動 func main() { a :=[5]int{1,2,3,4,5} b := a b[2] = 8 fmt.Println(a, b) }
切片則不然,如下代碼所示:
//由 main 函數作為程序入口點啟動 func main() { a :=[]int{1,2,3,4,5} b := a b[2] = 8 fmt.Println(a, b) }
程序輸出結果:a和b本質上指向同一個底層數組。 切片的底層數據結構其實是一個指針、len、cap。
原文:https://blog.csdn.net/li_101357/article/details/80199636