什么是回调函数?
它与调用函数有什么区别?
为什么要使用回调函数?
回调函数有哪些应用场景?
一文解决!
package main
import "fmt"
func main() {
call("123456", callback)
}
func callback(number string) {
fmt.Println("call:", number)
}
func call(number string, c func(string)) {
c(number)
}
上述代码可以理解为
callback 一词本来用于打电话。你可以打电话(call)给别人,也可以留下电话号码,让别人回电话(callback)。
--- 来源于知乎
但是好像似乎有点模糊
更官方的解释
函数可以作为其他函数的参数进行传递
然后在其他函数内调用执行称为回调
为什么要使用回调函数
上述代码完全可以这么写实现同样的功能
package main
import "fmt"
func main() {
call("123456")
}
func callback(number string) {
fmt.Println("call:", number)
}
func call(number string) {
callback(number)
}
那为什么还要把函数作为另一个函数的参数进行传递呢?
只要我们改变传进函数的参数,就可以实现不同的功能
package main
import "fmt"
func main() {
call("123456", callback)
call("123456", callback2)
call("123456", callback3)
}
func call(number string, c func(string)) {
c(number)
}
func callback(number string) {
fmt.Println("call:", number)
}
func callback2(number string) {
fmt.Println("call2", number)
}
func callback3(number string) {
fmt.Println("call3", number)
}
更加的灵活而且不用修改call的实现逻辑
回调函数的例子
通过go语言标准库的例子来解析回调函数
将函数作为参数的最好的例子是函数 strings.IndexFunc()
func IndexFunc(s string, f func(rune) bool) int {
return indexFunc(s, f, true)
}
func indexFunc(s string, f func(rune) bool, truth bool) int {
for i, r := range s {
if f(r) == truth {
return i
}
}
return -1
}
我们可以使用unicode.IsSpace
如
package main
import (
"fmt"
"strings"
"unicode"
)
func main(){
line := "hello world"
fmt.Println(strings.IndexFunc(line, unicode.IsSpace))
}
//结果
5
当然我们也可以自定义函数
如判断是不是ascii字符,并返回第一个不是ascii字符的位置
package main
import (
"fmt"
"strings"
"unicode"
)
func main(){
line := "hello world μ"
fmt.Println(strings.IndexFunc(line, unicode.IsSpace))
fmt.Println(strings.IndexFunc(line,IsAscii))
}
func IsAscii(r rune) bool {
if r > 255 {
return true
}
return false
}
可以看到,通过回调我们可以自定义一些功能,非常的人性化
回调的应用场景
以七牛云为例子
官方文档截取
综上最大特点就是可以支持自定义内容
灵活度更强
自定义上传回复的凭证
默认情况下,文件上传到七牛之后,在没有设置returnBody或者回调相关的参数情况下,七牛返回给上传端的回复格式为hash和key,例如:
{"hash":"Ftgm-CkWePC9fzMBTRNmPMhGBcSV","key":"qiniu.jpg"}
有时候我们希望能自定义这个返回的JSON格式的内容,可以通过设置returnBody参数来实现,在returnBody中,我们可以使用七牛支持的魔法变量和自定义变量。
bucket := "your bucket name"
putPolicy := storage.PutPolicy{
Scope: bucket,
ReturnBody: `{"key":"$(key)","hash":"$(etag)","fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"}`,
}
mac := qbox.NewMac(accessKey, secretKey)
upToken := putPolicy.UploadToken(mac)
则文件上传到七牛之后,收到的回复内容格式如下:
{"key":"github-x.png","hash":"FqKXVdTvIx_mPjOYdjDyUSy_H1jr","fsize":6091,"bucket":"if-pbl","name":"github logo"}