1.定義
回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來(lái)調(diào)用其所指向的函數(shù)時(shí),我們就說(shuō)這是回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對(duì)該事件或條件進(jìn)行響應(yīng)。
</br>
2.機(jī)制
- 定義一個(gè)回調(diào)函數(shù)
- 提供函數(shù)實(shí)現(xiàn)的一方在初始化的時(shí)候,將回調(diào)函數(shù)的函數(shù)指針注冊(cè)給調(diào)用者
- 當(dāng)特定的事件或條件發(fā)生時(shí),調(diào)用者使用函數(shù)指針調(diào)用回調(diào)函數(shù)對(duì)事件進(jìn)行處理
</br>
例1.這是一個(gè)簡(jiǎn)單的回調(diào)例子,調(diào)用函數(shù)test時(shí),調(diào)用真正的實(shí)現(xiàn)函數(shù)add
package main
import "fmt"
type Callback func(x, y int) int
// 提供一個(gè)接口,讓外部去實(shí)現(xiàn)
func test(x, y int, callback Callback) int {
return callback(x, y)
}
// 回調(diào)函數(shù)的具體實(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.這是一個(gè)將字符串轉(zhuǎn)為Int的例子,在轉(zhuǎn)換失敗的情況下執(zhí)行回調(diào)函數(shù),輸出錯(cuò)誤信息
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
}
}
// 記錄日志消息的具體實(shí)現(xiàn)
func errLog(msg string) {
fmt.Println("Convert error: ", msg)
}
func main() {
fmt.Println(stringToInt("18", errLog))
fmt.Println(stringToInt("hh", errLog))
}
</br>
通過(guò)上面的兩個(gè)簡(jiǎn)單例子,相信機(jī)智的你已經(jīng)了解Golang的回調(diào)機(jī)智咯~