這是『就要學習 Go 語言』系列的第 15 篇分享文章
函式
函式是一段能夠完成特定功能的程式碼段,可以接收輸入引數或者能夠返回想要的值。
函式宣告
Go 語言採用如下語法宣告一個函式:
func funcName(parameterName type) returntype {
//函式體
}
複製程式碼
可以看到,func
是宣告函式的關鍵字;funcName
是函式名;()
之間的是輸入引數,根據需要,可傳多個引數 (parName1 type, parName2 type)
或者不傳;returntype
是返回值型別,如果沒有返回值,可以省略。
func add(a int,b int) int {
return a + b
}
func main() {
fmt.Println("a + b =",add(1,2))
}
複製程式碼
輸出:
a + b = 3
複製程式碼
上面的add()
函式示例很簡單:兩數相加。()
和 {}
之間的int
是返回值的型別。如果有不止一個相同型別的輸入引數,則可以簡寫:
func add(a,b int,c,d string) int {
fmt.Println(c+d)
return a + b
}
func main() {
fmt.Println("a + b =",add(1,2,"add"," + "))
}
複製程式碼
輸出:
add +
a + b = 3
複製程式碼
a
和b
都是int
型,所有簡寫成a,b int
,c
和d
都是string
型別,同理。
多值返回
不像其他語言,Go 語言的函式是允許返回多個值的。
func calculate(a,b int) (int,int) {
return a+b,a*b
}
func main() {
sum,multi := calculate(1,2)
fmt.Println("a + b =",sum)
fmt.Println("a * b =",multi)
}
複製程式碼
上面的程式碼,calculate()
函式返回兩個值,在呼叫函式中不需要用到其中某一個值的時候,可以使用空白識別符號_
忽略。因為如果定義了變數而沒有使用,會編譯不通過。
func main() {
sum,_ := calculate(1,2)
fmt.Println("a + b =",sum)
//fmt.Println("a * b =",multi)
}
複製程式碼
命名返回值
在函式定義的時候,可以給所有的返回值分別命名,Go 會自動建立這些變數,在函式體中可以給變數賦值等。在函式結束的時候,直接使用return
就可以將返回值返回,而不用指定返回的變數。
func calculate(a,b int) (sum,multi int) {
sum = a + b
multi = a * b
return
}
func main() {
sum,multi := calculate(1,2)
fmt.Println("a + b =",sum)
fmt.Println("a * b =",multi)
}
複製程式碼
注意:函式結束時的return
是必須的,不能省略。
函式型別
Go 語言中,函式也是一種型別。如果兩個函式的入參型別和返回值型別均相同,則它們是同種型別。如果將函式作為引數傳遞給另外一個函式時或將函式作為返回值時,函式型別就會顯得很有用了。
func add(a,b int) (r int) {
r = a + b
return
}
func multi(c,d int) (res int) {
res = c * d
return
}
func main() {
fmt.Printf("%T \n",add)
fmt.Printf("%T",multi)
}
複製程式碼
輸出:
func(int, int) int
func(int, int) int
複製程式碼
定義了兩個函式 add()
和 multi()
,它們的入參和返回值都一樣,所有它們的型別相同,都是func(int, int) int
。
func add(a,b int) (r int) {
r = a + b
return
}
func multi(c,d int) (res int) {
res = c * d
return
}
func calculate(a,b int,f func(int,int) int) (r int) {
r = f(a,b)
return
}
func main() {
sum := calculate(1,2,add)
multi := calculate(1,2,multi)
fmt.Println(sum,multi)
}
複製程式碼
輸出:
3 2
複製程式碼
上面的程式碼,定義calculate()
函式,接收兩個int
型別的引數和一個func(int,int) int
型別的引數f
,在函式體裡,呼叫了f
函式。
可以給func(int,int) int
建立型別別名,是程式更簡潔:
func add(a,b int) (r int) {
r = a + b
return
}
func multi(c,d int) (res int) {
res = c * d
return
}
// 建立型別別名
type calculateFunc func(int,int) int
func calculate(a,b int,f calculateFunc) (r int) {
r = f(a,b)
return
}
func main() {
sum := calculate(1,2,add)
multi := calculate(1,2,multi)
fmt.Println(sum,multi)
}
複製程式碼
匿名函式
Go 語言中,函式可以作為一個值,這樣便可以將函式賦給一個變數或者返回一個函式變數。
var add = func(a,b int) (r int) {
r = a + b
return
}
func main() {
fmt.Println("a + b =",add(1,2))
}
複製程式碼
上面的程式碼,建立了一個匿名函式,賦給了一個全域性變數add
。Go 編譯器會自動判別變數add
的型別,這裡是func(int, int) int
。
匿名函式可以賦值,也可以立即執行:
func main() {
sum := func(a,b int) int {
return a + b
}(1,2)
fmt.Println(sum)
}
複製程式碼
輸出:
3
複製程式碼
上面的程式碼,定義匿名函式時,直接傳遞了兩個引數,返回結果。
(全文完)
原創文章,若需轉載請註明出處!
歡迎掃碼關注公眾號「Golang來啦」或者移步 seekload.net ,檢視更多精彩文章。
公眾號「Golang來啦」給你準備了一份神祕學習大禮包,後臺回覆【電子書】領取!