[A Tour of Go 學習筆記] 04 指針和結構
使用官方教學瞭解 Go 語言指針和結構
初入 Golang 的世界,首先我們使用官方教學:A Tour of Go
來認識基本的 Golang 使用
這篇介紹指針和結構的使用
指針(pointer)
Go 有指針,指針代表值在記憶體中的位址
*T
代表指向T
這個類型的指針,預設值是nil
var p *int // p = nil
&
符號會指向目標的「記憶體位址」
i := 42
p := &i // p = 0xc000018038 = 變數 i 的指針位置
*
可以取得該指針位置代表的「值」
fmt.Println(*p) // 透過指針 p 取得 i 代表的值
*p = 21 // 透過設定指針位置 p 的值,間接改變 i
這就是常說的「間接引用」或是「重新定向」
package main
import "fmt"
func main() {
i, j := 42, 2701
p := &i // point to i
fmt.Println(*p) // read i through the pointer
*p = 21 // set i through the pointer
fmt.Println(i) // see the new value of i
p = &j // point to j
*p = *p / 37 // divide j through the pointer
fmt.Println(j) // see the new value of j
}
/*
>>> 42
>>> 21
>>> 73
*/
結構 (struct)
類似於 JavaScript 的物件,是一堆欄位的集合
變數儲存單一值,如果需要表是比較複雜的概念例如座標,就可以使用結構
package main
import "fmt"
type Vertex struct {
X int
Y int
}
func main() {
fmt.Println(Vertex{1, 2})
}
/*
>>> {1 2}
*/
甚至連訪問方式都很像 JavaScript 的物件,使用.
來存取結構中的內容
注意到了嗎,這邊的X
和Y
都是大寫的
代表該內容被導出可以在外部被呼叫!
package main
import "fmt"
type Vertex struct {
X int
Y int
}
func main() {
v := Vertex{1, 2}
v.X = 4
fmt.Println(v.X)
}
/*
>>> 4
*/
上面提到的指針操作,同樣也適用於 struct 操作
package main
import "fmt"
type Vertex struct {
X int
Y int
}
func main() {
v := Vertex{1, 2}
p := &v // p 指向 v 的記憶體位置,代表他們是同一個目標
p.X = 1e9
fmt.Println(v)
}
/*
>>> {1000000000 2}
*/
創建 struct
package main
import "fmt"
type Vertex struct {
X, Y int
}
var (
v1 = Vertex{1, 2} // 建立型別為 Vertex 的 struct
v2 = Vertex{X: 1} // Y:0 是因為 int 型別預設為 0
v3 = Vertex{} // X:0, Y:0
p = &Vertex{3, 2} // 建立型別為 *Vertex 的 struct
)
func main() {
fmt.Println(v1, v2, v3, p)
}
/*
>>> {1 2} {1 0} {0 0} &{3 2}
*/