這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
函數構成代碼執行的邏輯結構。在Go語言中,函數的基本組成為:關鍵字func、函數名、參數列表、傳回值、函數體和返回語句。
函數定義
使用一個最簡單的加法函數來進行詳細說明:
package main
import (
"errors"
"fmt"
)
func Add(a int, b int) (ret int, err error) {
if a < 0 || b < 0 {
err = errors.New("Should be non-negative numbers!")
return
}
return a + b, nil // 支援多傳回值
}
如果參數列表中若干個相鄰的參數類型相同,比如上面例子中的a和b,則可以在參數列表中省略前面變數的型別宣告,如下所示:
func Add(a, b int)(ret int, err error){
//
}
如果傳回值列表中多個傳回值的類型相同,也可以用同樣的方式合并。
如果一個函數只有一個傳回值,也可以這麼寫:
func Add(a, b int) int {
//
}
函數調用
函數調用非常簡單,只要事先匯入該函數所在的包,就可以直接按照如下方式調用函數:
import "mymath"
c := mymath.Add(1,2)
注意一點,小寫字母開頭的函數只在本包內可見,大寫字母開頭的函數才能被其他包使用。這個規則也適用於類型和變數的可見度。
不定參數
不定參數是指傳入的參數個數為不定數量。為了做到這點,首先需要將函數定義為接受不定參數類型:
func myfunc(args ...int) {
for _, arg := range args {
fmt.Println(arg)
}
}
這段代碼的意思是,函數myfunc()接受不定數量的參數,這些參數的類型全部是int,所以它可以用如下方式調用:
myfunc(2, 3, 4)
myfunc(1, 3, 7, 13)
形如...type格式的類型只能作為函數的參數類型存在,並且必須是最後一個參數。
之前的例子中將不定參數類型約束為int,如果你希望傳任意類型,可以指定類型為interface{}。下面是Go語言標準庫中fmt.Printf()的函數原型:
func Printf(format string, args ...interface{}) {
//
}
以下是一個完整的例子:
// varg1
package main
import (
"fmt"
)
func MyPrintf(args ...interface{}) {
for _, arg := range args {
switch arg.(type) {
case int:
fmt.Println(arg, "is an int value.")
case string:
fmt.Println(arg, "is a string value.")
case int64:
fmt.Println(arg, "is an int64 value.")
default:
fmt.Println(arg, "is an unknown type.")
}
}
}
func main() {
var v1 int = 1
var v2 int64 = 234
var v3 string = "hello"
var v4 float32 = 1.234
MyPrintf(v1, v2, v3, v4)
}
多傳回值
Go語言中支援多傳回值函數。
如果調用方調用了一個具有多傳回值的方法,但是卻不想關心其中的某個傳回值,可以簡單地用一個底線來跳過這個傳回值。
匿名函數和閉包
匿名函數是指不需要定義函數名稱的一種函數實現方式。