Go語言func匿名函數(shù)閉包示例詳解
前言
今天繼續(xù)為大家更新Go語言學習記錄的文章。
函數(shù)是任何一門編程語言最重要的組成部分之一。函數(shù)簡單理解是一段代碼的封裝:把一段邏輯抽象出來封裝到一個函數(shù)中,給他取個名字,每次需要的時候調(diào)用這個函數(shù)即可。使用函數(shù)能夠讓代碼更清晰,更簡潔。
定義
下面的代碼段介紹了go語言中函數(shù)定義的各種情況,以及延遲函數(shù)的使用。
package main
import "fmt"
// 函數(shù)的定義
func f1(x int, y int) (ret int) {
return x + y
}
// 無返回值的函數(shù)
func f2(x int, y int) {
fmt.Println(x + y)
}
// 沒有參數(shù)也沒有返回值的
func f3() {
fmt.Println("1111")
}
// 沒有參數(shù) 有返回值的
func f4() int {
return 4
}
// 返回值可以命名也可以不命名
// 命名的返回值就相當于在函數(shù)中聲明一個變量
func f5(x int, y int) (ret int) {
ret = x + y //注意:因為已經(jīng)在返回值中聲明了ret,所以這里用= 而不是:= ,避免重復聲明問題
return //因為已經(jīng)在函數(shù)體中聲明了ret,所以在return的時候不需要重復聲明
}
// 多個返回值
func f6() (int, int) {
return 1, 2
}
// 多個參數(shù)簡寫的方式
// 當參數(shù)的類型一致時,可以將連續(xù)的相同參數(shù) 前面參數(shù)的類型省略 比如:
func f7(x, y, z int, a, b string, c, d bool) int {
return x + y + z
}
// 可變長參數(shù)
// 可變長參數(shù)必須放在函數(shù)參數(shù)的最后
func f8(x string, y ...int) {
fmt.Println(x)
fmt.Println(y)
}
// defer 延遲執(zhí)行
func deferDemo() {
defer fmt.Println("111") //最先defer的語句最后執(zhí)行
defer fmt.Println("222")
fmt.Println("333")
}
// go語言中函數(shù)沒有默認參數(shù)的概念
func main() {
r := f5(1, 2)
fmt.Println(r)
m, n := f6()
fmt.Println(m, n)
r7 := f7(1, 2, 3, "1", "1", true, false)
fmt.Println(r7)
f8("hah") //可變長度 不填也可以
f8("hah", 1, 2, 3, 4)
//延遲函數(shù)測試
deferDemo()
}
函數(shù)也可以作為函數(shù)的參數(shù)
舉個栗子:
package main
import "fmt"
// 函數(shù)也可以作為函數(shù)參數(shù)的類型
func f3(x func() int) {
ret := x()
fmt.Printf("f3打印ret的值:%v\n", ret) //2
fmt.Printf("f3打印ret的類型:%T\n", ret) //int
}
func main() {
a := f2
fmt.Printf("a的類型:%T\n", a)
f3(a)
}
打印結果:

函數(shù)作為函數(shù)的返回值
package main
import "fmt"
func f2() int {
return 2
}
func ff(x, y int) int {
return x + y
}
// 函數(shù)不僅可以作為參數(shù),還可以作為返回值
func f5(x func() int) func(int, int) int {
return ff
}
func main() {
f7 := f5(f2)
fmt.Printf("f7的值:%v\n",f7) //f7返回的是一個函數(shù)
fmt.Printf("f7的類型:%T\n", f7)
}
打印結果:

小結:
- 我們打印f7的值是一個內(nèi)存地址
- f7的類型和我們預期的一致,返回了函數(shù)類型,就是我們定義的ff()函數(shù)
匿名函數(shù)
匿名函數(shù)就是沒有名字的函數(shù)。匿名函數(shù)多用于實現(xiàn)回調(diào)函數(shù)和閉包。
在Go語言中函數(shù)內(nèi)部不能再像之前那樣定義函數(shù)了,只能定義匿名函數(shù)。
匿名函數(shù)的定義格式如下:
func(參數(shù))(返回值){
函數(shù)體
}
匿名函數(shù)因為沒有函數(shù)名,所以沒辦法像普通函數(shù)那樣調(diào)用,所以匿名函數(shù)需要保存到某個變量或者作為立即執(zhí)行函數(shù):
func main() {
// 將匿名函數(shù)保存到變量
add := func(x, y int) {
fmt.Println(x + y)
}
add(10, 20) // 通過變量調(diào)用匿名函數(shù)
//自執(zhí)行函數(shù):匿名函數(shù)定義完加()直接執(zhí)行
func(x, y int) {
fmt.Println(x + y)
}(10, 20)
}
小結:自執(zhí)行函數(shù)就是在匿名函數(shù)后面追加(),表示不需要外部調(diào)用,直接執(zhí)行。
閉包
閉包是一個函數(shù),這個函數(shù)包含了他外部作用域的一個變量
舉個栗子
package main
import "fmt"
func adder(x int) func(int) int {
return func(y int) int {
x += y
return x
}
}
func main() {
f1 := adder(1)
ret := f1(2)
fmt.Println(ret)
}
打印結果:

小結: 上面的栗子就是一個典型的閉包結構:匿名函數(shù)內(nèi)部包含了他外部的變量x。
閉包=函數(shù)+引用環(huán)境
總結
這篇文章我們詳細介紹了Go語言中函數(shù)的定義、也介紹了匿名函數(shù)和閉包的知識點,更多關于Go語言func匿名函數(shù)閉包的資料請關注腳本之家其它相關文章!
相關文章
golang(gin)的全局統(tǒng)一異常處理方式,并統(tǒng)一返回json
這篇文章主要介紹了golang(gin)的全局統(tǒng)一異常處理方式,并統(tǒng)一返回json,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Go語言實現(xiàn)一個簡單的并發(fā)聊天室的項目實戰(zhàn)
本文主要介紹了Go語言實現(xiàn)一個簡單的并發(fā)聊天室的項目實戰(zhàn),文中根據(jù)實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03

