go 的指標
在上一篇文章中提到自定義型別的方法,讀者們可以試試看把該自定義型別生成的物件賦予到另一個變數上在更改其屬性的值,最後觀察其值的變化狀況。接下來就是跟大家分享如何用 *
來解決這問題。
go 的指標做什麼用
在介紹指標之前先說明一下前面內容發生的原因,主要是在 go 語言內變數的賦值是產生一個新的記憶體空間,並把原來的值複製到新的記憶空間內,所以兩個變數雖然看起來一樣,但是是兩個不同的記憶體位置的資料,所以複製的物件更改屬性後原來的物件屬性還是跟以前一樣。
因此這篇主要說明 go 的指標,接下來會分別跟大家介紹指標如何宣告、賦值及使用。
指標的宣告
指標宣告的方式跟變數一樣,差別的地方主要是在類別前加一個關鍵字 *
即可,請大家看一下下列例子
var p2 *Vertex
上面說明的是指標宣告的方式,接下來要說明如何賦值給指標。
指標的賦值
上一個段落說明如何宣告一個指標的變數,接下來要說明如何賦值給一個指標變數,這部分跟變數一樣也有不需宣告直接賦值的初始化寫法,這一邊一併介紹給大家,請大家先看一下下列說明
var p2 *Vertex
v := Vertex{1, 1}
p2 = &p
上面例子是宣告一個指標變數 p2 然後宣告一個有值的變數 v 最後使用 &
將 v 的記憶體位置存放在 p2 的記憶體位置,如此就可以使用 p2 來改變 v 的內容。
這是一個完整的寫法,但是還可以用簡單的寫法來做這件事情,請大家看一下下面的說明
v := Vertex{1, 1}
p2 := &p
上面的例子是不事先宣告變數,而是宣告變數與賦值一起的指標初始化寫法。
指標的使用
其實指標變數的用法跟一般變數的用法相同,也是透過 .
來存取變數,請大家看一下下列例子
package main
import "fmt"
type Vertex struct {
X int
Y int
}
func main() {
var p2 *Vertex
p := Vertex{1,1}
Pos(p)
p2 = &p
p2.X = 2
Pos(p)
}
func Pos(v Vertex) {
fmt.Println(v)
}
簡單說明一下就是宣告一個指標變數 p2 ,並生成一個自定義型別的變數 p ,接下來把 p 的記憶體位置給予 p2 ,並透過 p2.X 把 p 的屬性 X 的值改變成為 2 ,如此可以觀察到列印出來的 p 的內容改變了。
結論
這篇文章說明一下 go 的指標如何宣告、賦值與使用,讓大家對於 go 的指標有一個基礎概念,下一篇文章會再跟大家分享一些關於類別、指標與方法間進一步的內容。