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