查看上一篇數組類型請點我
2.指針類型
指針這個東西啊,開始真的是讓我費解,爲什麼需要這個東西呢,感覺根本沒有用啊,但是go說:我不要你覺得,我要我覺得。然後就仔細的研究了一下,原來這個東西還是很有用的,接下來先說說go指針是什麼以及指針的使用場景。
指針變量即一個值的內存地址,它所指向的值的內存地址在 32 和 64 位機器上分別佔用 4 或 8 個字節,佔用字節的大小與所指向的值的大小無關。當一個指針被定義後沒有分配到任何變量時,它的默認值爲 nil。
指針的使用場景:
1.當作爲方法的receiver
時,如果你的方法會改變receiver
時,你必須傳遞指針(此條最重要,然後學到這塊的同學根本不知道receiver是什麼,所以看到這條時並不需要糾結)。
2.作爲入參時,golang是值拷貝傳遞, 如果是比較大的struct(一種更高級的數據類型,就當作佔用內存很大的一個參數)
作爲參數,那麼顯然拷貝一個指針比拷貝整個結構代價要小一些。
所以,到此只當作指針可以提高效率就好了(receiver的事到receiver再談),因爲傳遞一個幾個字節的指針總比傳一個超級大字符串(參數)要高效。
下面介紹指針的用法,只需要記住兩點:
1. &,取地址操作符,獲取變量的地址
2. *,定義指針變量,獲取指針變量指向的變量值
package main
import "fmt"
func main() {
var vara = 100
var ip *int
ip = &vara
fmt.Println("變量vara的地址是:", ip)
fmt.Println("變量vara的值:", *ip )
}
輸出結果:
變量vara的地址是: 0xc000016058
變量vara的值: 100
指針作爲參數傳遞:相當於淺拷貝
package main
import "fmt"
func main() {
var a = 100
var b = 200
fmt.Printf("交換前 a 的值 : %d\n", a )
fmt.Printf("交換前 b 的值 : %d\n", b )
swap(&a, &b)
fmt.Printf("交換後 a 的值 : %d\n", a )
fmt.Printf("交換後 b 的值 : %d\n", b )
}
func swap(x *int, y *int) {
var temp int
temp = *x
*x = *y
*y = temp
}
輸出結果:
交換前 a 的值 : 100
交換前 b 的值 : 200
交換後 a 的值 : 200
交換後 b 的值 : 100
查看下一篇結構體類型請點我