Byte Ebi's Logo

Byte Ebi 🍤

每天一小口,蝦米變鯨魚

[A Tour of Go 學習筆記] 04 指針和結構

使用官方教學瞭解 Go 語言指針和結構

Ray

初入 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 的物件,使用.來存取結構中的內容
注意到了嗎,這邊的XY都是大寫的
代表該內容被導出可以在外部被呼叫!

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}
*/

最新文章

Category

Tag