GoLang回调实现,非传func参数方式

zerochl · · 866 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

写这篇文章的初衷是因为最近被GoLang的一个低级问题搞蒙了,加上本蠢货用的还是IntelliJ的2017版本,对GoLang的错误提示非常有限,导致为了解决一个回调问题花了一个多小时。

问题呢,就是GoLang的回调了,在我的印象中GoLang实现回调和Java有那么一点区别,但是大同小异。首先如果是个简单的回调那么肯定没啥难度,传入一个struct对象就可以了,但是我想的是可以随时创建这个回调对象,在各种场合,那么就决定了这个回调对象可能是多个,所以必须是接口。

so,思路其实很清晰,回调参数使用接口就可以了,但是今天我被自己蠢到了,忘了GoLang的特性,首字母非大写是不能给外部包调用的,所以,一言难尽。

在解决问题的期间我不服气的搜了百度与google,发现搜出来的内容居然都是传入func对象来实现回调,这简直太low了,因为回调可能有多个方法,每个方法传一个对象进来吗?

所以,我觉得有义务写这篇文章,给GoLang的回调添加一个形式,那么来贴代码吧。

fileserver包:文件服务,用于文件查询与提供下载服务。

type StartCallBack interface {
    OnError(err error)
    OnSuccess(files []*entity.File)
}

func StartFile(conf *entity.FileServerConf, startCallBack StartCallBack) {
    // 获取文件的MD5
    files, err := queryFileList(conf.FilePath)
    if err != nil {
        log.Println("queryFileList err:", err.Error())
        startCallBack.OnError(err)
        return
    }
    log.Println("startCallBack:", startCallBack)
    // 回调通知文件查询成功,后面服务开启
    startCallBack.OnSuccess(files)
    // 开启文件服务
    ...
}

main包:调用打开文件服务

type StartCallBackTest struct {
    //fileserver.StartCallBack
}

func (scbt StartCallBackTest) OnError(err error) {
    log.Println("error:", err.Error())
}

func (scbt StartCallBackTest) OnSuccess(files []*entity.File) {
    log.Println("on success:", len(files))
}

func main()  {
    conf := &entity.FileServerConf{
        Port: "8081",
        Route: "/staticfile/",
        FilePath: "./staticfile",
    }
    startCallBacktest := StartCallBackTest{}
    log.Println("startCallBacktest:", startCallBacktest)
    fileserver.StartFile(conf, startCallBacktest)
}

从代码中可以看到这是用接口来实现的回调,使用中需要注意,在StartFile方法中接口参数不能使用指针类型,因为需要GoLang做识别是否是这个接口实现。OnError方法前面的所属定义也不能是指针类型。
OK,以后回调就用接口吧,爽太多了。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:zerochl

查看原文:GoLang回调实现,非传func参数方式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:1006366459

866 次点击  
加入收藏 微博
4 回复  |  直到 2019-07-16 00:03:19
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传