函式 -- 就要學習 Go 語言

Seekload發表於2019-01-23

這是『就要學習 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
複製程式碼

ab都是int型,所有簡寫成a,b intcd都是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來啦」給你準備了一份神祕學習大禮包,後臺回覆【電子書】領取!

公眾號二維碼

相關文章