go语言之路

什么是回调函数?

什么是回调函数?

它与调用函数有什么区别?

为什么要使用回调函数?

回调函数有哪些应用场景?

一文解决!

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"}

一文解惑intel、amd和arm

上一篇

Π中是否一定存在你的生日?

下一篇

你也可能喜欢

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片

个人微信公众号

we-tuiguang

qq交流群

群号:1046260719

微信扫一扫

微信扫一扫