了解 Go 函式是學習 Go 非常重要的一步,所以韓式是什麼?
簡單來說,就是一個程式區塊,將程式碼包裝,這樣的做法方便之後在別的地方可以重複利用此函式。
在程式中想要運用函式有兩個步驟:
在 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)
}
如果沒有給資料型態的話,在 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
在 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 時,就只有執行函式內的動作。下一章會有詳細介紹。
參考資料: