iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
Modern Web

起步Go!Let's Go!系列 第 9

[ Day 09] Go 函式魔法 - 定義、召喚、傳遞

  • 分享至 

  • xImage
  •  

了解 Go 函式是學習 Go 非常重要的一步,所以韓式是什麼?
簡單來說,就是一個程式區塊,將程式碼包裝,這樣的做法方便之後在別的地方可以重複利用此函式。
在程式中想要運用函式有兩個步驟:

  1. 定義函式。
  2. 呼叫函式。
    要先定義(建立)函式,才能呼叫(使用)函式。

定義函式 func

在 Go 中,一定會有 func main() 這個函式,也可以說這個函式是 Go 的進入點,當執行一個 Go 程式時,系統會自動尋找並執行 func main() 函式中的程式,如果少了這個進入點就無法進入 Go 中,也就沒辦法正常執行了。
也是這個原因前面的範例中都有 func main() 就是這樣的原因。基本的函式結構如下:
基本語法:

func 函式名稱(參數列表){
    函式內部的程式碼
}
func main(){
    // TODO
}

根據上面解釋的,main() 是沒有接收任何值,所以 () 內沒有東西,又因為沒有回傳任何值所以 () 後面也是空的。

呼叫函式

呼叫函式跟定義函式是相呼應的。當要呼叫函式就可以用下面的方法去呼叫該函式。
基本語法:

函式名稱(參數資料)

情境: 作一個函式,可以將浮點數取絕對值

package main
import "fmt"
func abs(n float64) float64{
    if n >= 0 {
        return n 
    }
    return -n
}
func main(){
    fmt.Println(abs(44.5))  // 呼叫 abs 函式並傳引數給它
    fmt.Println(abs(-44.5)) // 呼叫 abs 函式並傳引數給它
}

執行結果:
44.5
44.5

小試身手

範例一

可以印出 Hello 的函式:

func showHello(){
    fmt.Println("Hello")
}

呼叫 showHello 函式:

func main(){
    showHello() // 會去呼叫 showHello 函式 
}

*注意:
在 Go 程式在執行時,main 函式都一定會先被執行。

範例二

可以印出任何訊息的函式:

// 參數名稱 資料型態
func show (msg string){
    fmt.Println(msg)
}
  • 補充:
    在 Go 中與 Ruby 不一樣的點:
    在定義函式中參數時,除了要給參數名稱,還要給參數的資料型態
    也就是看你今天傳進來的參數是要整數、浮點數或是字串等。

如果沒有給資料型態的話,在 build 的過程中,會造成錯誤。

$ go build xxx.go
# command-line-arguments
./func-basic.go:5:11: undefined: msg

所以 msg 會印出什麼?
這就會由以下的 show 函式去決定。
呼叫 show 函式:

package main
import "fmt"
func main(){
    show("Hello")
    show("妳好")
}

執行結果:
Hello
妳好

範例三

可以做整數乘法的函式:

func multiply(n1 int, n2 int){
    var result int = n1 * n2
    fmt.Println(result)
}

在函式中可以放進多個參數,但要用逗號 , 隔開。

呼叫 multiply 函式:

func main(){
    multiply(3, 4)
    multiply(-2, 3)
}

執行結果:
12
-6

中場練習

計算 1+2+3+.....+max 的函式包裝

package main
import "fmt"
func add (max int){
    var result int = 0
    var n int 
    for n = 0; n <= max; n++{
        result+=n
    }
    fmt.Println(result)
}
func main(){
    add(100)
    add(50)
    add(10)
}

執行結果:
5050
1275
55

沒有 return 的 function

在 Go 中,一個函式不一定要有回傳值,也可以是一個動作,如下:

package main
import "fmt"
func noReturn(day string){
    fmt.Println(day + "看電影")
}
func main(){
    noReturn("星期一")
    noReturn("星期三")
}

執行結果:
星期一看電影
星期三看電影

沒有參數的函式

在 Go 中,一個函式也不一定要參數,通常這是要執行一些操作,而不需要外部輸入的數據。像下面的例子:

package main
import "fmt"
func release() string{
    return "ピリカピリララ ポポリナペペルト"
}
func main(){
    fmt.Println(release())
}

輸出結果:
ピリカピリララ ポポリナペペルト

兩個以上參數的函式

在 Go 中,函式可以接受多個參數。可以在函式的定義中指定多個參數,每個參數都需要指定名稱資料型態

package main
import "fmt"
func release(power string, name string) string{
    return "隱藏著" + power + "力量的鑰匙啊,在我面前顯示你真正的力量,跟你定下約定的" + name + "命令你,封印解除!"
}
func main(){
    dialog := release(星星, 小櫻)
    fmt.Println(dialog)
}

執行結果:
隱藏著星星力量的鑰匙啊,在我面前顯示你真正的力量,跟你定下約定的小櫻命令你,封印解除!

有時,新手可能會在有 return沒有 return 之間搞混亂。
簡單來說,當有 return 時,代表除了執行函式中的動作外,還能將值帶到別的地方去使用。例如讓fmt.Println() 使用;當沒有 return 時,就只有執行函式內的動作。下一章會有詳細介紹。

參考資料:

  1. Golang 函式基礎 - 函式的定義、呼叫、與參數 By 彭彭

上一篇
[ Day 08 ] Go 流程控制 - for 迴圈中的 break 和 continue 命令
下一篇
[ Day 10] Go 函式中的魔法 Return
系列文
起步Go!Let's Go!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言