> 匿名函數即沒有名字的函數,常用于實現回調函數、閉包等應用。
[TOC]
## 直接調用
~~~
func() {
fmt.Printf("func 1\n")
}()
// 有參數的情況下,后面是傳入對應的參數
func(x int) {
fmt.Printf("x is %d\n", x)
}(3)
~~~
## 將匿名函數賦值給變量
~~~
// 定義一個閉包,并將閉包函數賦值給變量f1、f2
num := 0
//var f1 func()
var f2 func(x int, y int) int
f1 := func() {
// 只直接引用上下文環境
num ++
}
f2 = func(x int, y int) int {
return x+y
}
// 執行結果
f1()
f1()
fmt.Println(num)
total := f2(2,3)
fmt.Println(total)
~~~
## 將匿名函數用作回調函數
~~~
package main
import "fmt"
func main() {
//調用函數,對每個元素后面都加上a標識
arr := []string{"1", "2", "3"}
fmt.Println(visit(arr, func(v string) string {
v += "a"
return v
}))
//調用函數,對每個元素后面都加上b標識
fmt.Println(visit(arr, func(v string) string {
v += "b"
return v
}))
}
//定義一個函數,遍歷切片元素,對每個元素進行處理
func visit(list []string, f func(string) string) string {
str := ""
for _, value := range list {
str += f(value)
}
return str
}
~~~
> 運行結果
~~~
1a2a3a
1b2b3b
~~~
## 將匿名函數作為閉包
> 一個函數和與其相關的引用環境結合組成的實體
~~~
package main
import "fmt"
func main() {
var f = Adder()
fmt.Println(f(1), "-")
fmt.Println(f(20), "-")
fmt.Println(f(300), "-")
}
func Adder() func(int) int {
var x = 0
return func(delta int) int {
x += delta
return x
}
}
~~~
> 運行結果
~~~
1 -
21 -
321 -
~~~
- 基礎知識
- 開發環境
- 包名規則
- 包初始化 (init)
- 基礎數據類型
- 基礎類型轉換
- 格式化輸出
- go指針
- 流程控制語句
- 函數定義
- 匿名函數
- 數組和切片
- map集合
- 結構體
- Interface接口
- 日期處理
- 數學計算
- 正則表達式
- 協程 (并發處理)
- channel
- waitgroup
- mutex (鎖機制)
- websocket
- protobuf
- Redis
- 錯誤處理
- 打包程序
- NSQ消息隊列
- 單元測試
- beego
- 安裝入門
- Gin
- 快速入門
- 路由與控制器
- 處理請求參數
- 表單驗證
- 處理響應結果
- 渲染HTML模版
- 訪問靜態文件
- Gin中間件
- Cookie處理
- Session處理
- Gin上傳文件
- swagger
- pprof性能測試
- GORM
- 入門教程
- 模型定義
- 數據庫連接
- 插入數據
- 查詢數據
- 更新數據
- 刪除數據
- 事務處理
- 關聯查詢
- 屬于 (BELONG TO)
- 一對一 (Has One)
- 一對多 (Has Many)
- 多對多 (Many to Many)
- 預加載 (Preloading)
- 錯誤處理
- 第三方常用插件
- viper 讀取配置文件
- zap 高性能日志
- Nginx代理配置
- Goland 快捷鍵