go語言關於值型別和引用型別
阿新 • • 發佈:2018-12-31
前言:關於值型別和引用型別確實是個比較繞的問題,之前在學校的時候學習C語言的時候,就感覺沒有看太懂,後面看java,關於引用也是模模糊糊,這個東西也確實比較抽象,估計好多寫了好幾年程式碼的人有也有些迷惑。
1、在go語言中,值型別和引用型別有以下特點:
a、值型別:基本資料型別,int,float,bool,string,以及陣列和struct
特點:變數直接儲存值,記憶體通常在棧中分配,棧在函式呼叫完會被釋放
b、引用型別:指標,slice,map,chan等都是引用型別
特點:變數儲存的是一個地址,這個地址儲存最終的值。記憶體通常在堆上分配,通過GC回收。
2、這個的東西總結也不太好描述,還是程式碼看得比較清楚,用函式實現交換兩個函式的值,來深刻感受以下值型別和引用型別:
package main import ( "fmt" ) //在函式內部修改值,不會影響函式外它的值,int是值型別 func swap1(a, b int) { temp := a a = b b = temp } //可以通過返回值,實現交換 func swap2(a, b int) (c, d int) { c = b d = a return c, d } //改變指標所指記憶體的值,指標是引用型別,把指標所指的值換了,可實現交換 func swap3(a, b *int) { temp := *a *a = *b *b = temp return } // 這樣交換的是兩個表示記憶體地址的值,也是不會影響函式外邊的值的 func swap4(a, b *int) { temp := a a = b b = temp } func main() { first := 100 second := 200 third := 300 fourth := 400 swap1(first, second) fmt.Println("first= ", first) fmt.Println("second= ", second) three, four := swap2(300, 400) fmt.Println("third= ", three) fmt.Println("fourth= ", four) swap3(&first, &second) fmt.Println("first= ", first) fmt.Println("second= ", second) swap4(&third, &fourth) fmt.Println("third= ", third) fmt.Println("fourth= ", fourth) }
結果執行如下:
first= 100 second= 200 third= 400 fourth= 300 first= 200 second= 100 third= 300 fourth= 400
可能還是比較繞,慢慢理解吧,哈哈~~~