Thursday, January 13, 2022

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

 

[前言]

函式(Function) 指的是將一或多段程式碼包裝起來,並且可以定義不給或是給定帶入的參數值,並可以重複使用。在程式開發中,是非常重要且經常使用的特性。因為它可以讓你的程式碼更方便維護與容易理解。

在之前的文章內有一些練習的連結,大家如果有注意到的話,每個練習都有一個func main() 的主程式函式定義,這也是Golang程式開始執行的進入點。

[函式(Function)之定義]

Golang 定義函式時,利用關鍵字func 放在前面,後面接著函式名稱,而需要輸入的參數型別宣告,則是放在名稱之後的小括號內。如果多個參數有同樣的型別,那麼只要最右邊同型別的名別右方加上型別就可以了。所需要回傳的變數前面須加上return關鍵字。

例如: 

func doJob(input1, input2 string) string {
    // 列印出輸入的參數內容
    fmt.Println("My Data:", input1, input2)
    ret := input1 + "-" + input2
    return ret
}

值得注意的是,Golang可以有兩個以上的傳回值,且傳回值可以設定名稱。若回傳值超過一個以上,需要用小括號把回傳型別內容放在其中。

例如: 

func doJob2(input1, input2 string) (string, string) {
    // 列印出輸入的參數內容
    fmt.Println("My Data:", input1, input2)
    ret1 := input1 + "-" + input2
    ret2 := input2 + "-" + input1
    return ret1,ret2
}

們在 [用Golang寫小遊戲教學] 第四章 陣列(Array)與切片(Slice) 有個例子: https://go.dev/play/p/2z_2NLAI1Gd


這個例子把所有的程式碼都放到main() 內,這樣不好,我們來改寫它。
試著創造出一個新的函式名稱為myTask() ,並需要輸入型別string的參數myName,來取代原有的程式碼:

func myTask(myData string) {
    // 列印出輸入的參數內容
    fmt.Println("My Data:", myData)
    names := []string{"Tom", "John"}
    fmt.Println("names:", names, "長度:", len(names), "容量:", cap(names))
    score1 := make([]int, 5) // len=4 cap=4,[0,0,0,0,0]
    fmt.Println("score1:", score1, "長度:", len(score1), "容量:", cap(score1))
    var names2 []string
    names2 = names
    names2[0] = "Danny"
    fmt.Println("names2:", names2, "長度:", len(names2), "容量:", cap(names2))
    score2 := make([]int, 5, 10) // len=5 cap=10, [0,0,0,0,0]
    score2[3] = 100
    fmt.Println("score2:", score2, "長度:", len(score2), "容量:", cap(score2))
}

而原有的主程式函式main 內的程式碼可以被這個函式myTask所取代。

func main() {
myTask("我準備輸入參數")
}

由於這myTask需要給一個string字串內容,我這邊的例子給了如上述的字串(你可以更換成其他的字串內容):

注意: Golang是強型態的語言,當我們定義myTask函式的輸入myData參數是字串型態後,就不能在呼叫myTask函式時,給定其他型別的值。

我們來試看看這被修改後的完整例子(很簡單吧!):

https://go.dev/play/p/3KSjePvVTLQ 

結果:

My Data: 我準備輸入參數
names: [Tom John] 長度: 2 容量: 2
score1: [0 0 0 0 0] 長度: 5 容量: 5
names2: [Danny John] 長度: 2 容量: 2
score2: [0 0 0 100 0] 長度: 5 容量: 10

No comments: