初識golang-數據類型_指針

查看上一篇數組類型請點

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

查看下一篇結構體類型請點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章