1.定義
回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)颓影。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù)鸳碧,當(dāng)這個指針被用來調(diào)用其所指向的函數(shù)時盾鳞,我們就說這是回調(diào)函數(shù)犬性≌袄耄回調(diào)函數(shù)不是由該函數(shù)的實現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的乒裆,用于對該事件或條件進行響應(yīng)套利。
</br>
2.機制
- 定義一個回調(diào)函數(shù)
- 提供函數(shù)實現(xiàn)的一方在初始化的時候,將回調(diào)函數(shù)的函數(shù)指針注冊給調(diào)用者
- 當(dāng)特定的事件或條件發(fā)生時鹤耍,調(diào)用者使用函數(shù)指針調(diào)用回調(diào)函數(shù)對事件進行處理
</br>
例1.這是一個簡單的回調(diào)例子肉迫,調(diào)用函數(shù)test時,調(diào)用真正的實現(xiàn)函數(shù)add
package main
import "fmt"
type Callback func(x, y int) int
// 提供一個接口稿黄,讓外部去實現(xiàn)
func test(x, y int, callback Callback) int {
return callback(x, y)
}
// 回調(diào)函數(shù)的具體實現(xiàn)
func add(x, y int) int {
return x + y
}
func main() {
x, y := 1, 2
fmt.Println(test(x, y, add))
}
</br>
例2.這是一個將字符串轉(zhuǎn)為Int的例子喊衫,在轉(zhuǎn)換失敗的情況下執(zhí)行回調(diào)函數(shù),輸出錯誤信息
package main
import (
"strconv"
"fmt"
)
type Callback func(msg string)
//將字符串轉(zhuǎn)換為int64杆怕,如果轉(zhuǎn)換失敗調(diào)用Callback
func stringToInt(s string, callback Callback) int64 {
if value, err := strconv.ParseInt(s, 0, 0); err != nil {
callback(err.Error())
return 0
} else {
return value
}
}
// 記錄日志消息的具體實現(xiàn)
func errLog(msg string) {
fmt.Println("Convert error: ", msg)
}
func main() {
fmt.Println(stringToInt("18", errLog))
fmt.Println(stringToInt("hh", errLog))
}
</br>
通過上面的兩個簡單例子族购,相信機智的你已經(jīng)了解Golang的回調(diào)機智咯~