Thursday, February 3, 2022

[用Golang寫小遊戲教學] 第八章 指標

 [前言]

指標語法在C/C++程式語言中是非常重要的用法與功能,它可以讓程式更快速且更高效。Golang保有了指標語法,之後的章節在寫小遊戲時也會用到,所以我們需要了解如何正確地使用它。

[指標快速入手]

透過變數宣告時,需要在型別前面加上 *號,代表是指標型態,用來告訴編譯器這變數是某種型別的指標變數

給值時也要給值的位置,我們在值前面加上 & 符號(位址運算子)。請看下面例子:


var data string = "Danny"
// 使用指標
var myName *string
myName = &data
fmt.Println("My name is:", *myName)

結果:

My name is: Danny 

指標也可以用在變數短宣告,如下:

var data2 = 18
// 使用指標
myAge := &data2
fmt.Println("My Age is:", *myAge)

結果:

My Age is: 18 

對於上面範例來說,使用指標的好處是不需要複製變數內的資料,而是直接擷取變數的位置當作是值。也因為是值的位置,當我們需要使用它時,也需要透過位置把值取得。

注意: 指標的零值是nil

內建函式new()可以建立一個指標變數。它會回傳一個指向你傳入的型別的零值實例的指標:

var myAge2 = new(int)
// 使用指標
fmt.Println("Before assigned, my age2 is:", *myAge2)
myAge2 = &data2
fmt.Println("After assigned, my age2 is:", *myAge2)

結果:

Before assigned, my age2 is: 0
After assigned, my age2 is: 18


我們再來看看比較複雜的例子,需要運用到之前所學的幾章:

[用Golang寫小遊戲教學] 第五章 函式(Function)

取得常數的位址有時候會很不方便,除了我們之前的例子所使用的方法之外(先由一個保存常數的變數來取得此變數的位址),或是使用輔助函式來傳回位址,請看下列範例 :

// 用來回傳常數的位址
func getStrPtr(s string) *string {
return &s
}

我們定義了一個結構型別 Person 並且將其初始化,同時透過& 符號(位址運算子)將此結構型別的實例的位址給了newP變數。同時也使用了自訂的輔助函式getStrPtr()來取得"Liu"字串常數的位址。

type Person struct {
FirstName string
LastName  *string
Age       int
}

newP := &Person{
FirstName: "Danny",
LastName:  getStrPtr("Liu"),
Age:       18,
}

fmt.Println("Personal Data:", newP.FirstName, *newP.LastName, newP.Age)

結果:

Personal Data: Danny Liu 18

Golang的指標還有很多議題需要了解,但以初學來說這樣已經可以上戰場了。我們在第九章即將開始實戰。[用Golang寫小遊戲教學] 第九章 超簡化的碰撞檢測遊戲

上述的例子都可以參考下列 go playground 並執行:
https://go.dev/play/p/znoStUxxJPm

結果:

My name is: Danny
My Age is: 18
Before assigned, my age2 is: 0
After assigned, my age2 is: 18
Personal Data: Danny Liu 18




No comments: