阿小信大人的头像
Talk is cheap. Show me the code. Linus Torvalds

使用Go定义一个可以调用任意回调函数的函数2018-10-15 11:49

原始需求是这样的:我需要监听一个json文件是否发生变化,一旦发生变化就重新调用函数读取文件中新的json来更新一个变量。

现在的需求是想把这种监听到某个事件自动就调用一个函数来处理的通用写法,Golang新手,很多写法都受到Python的影响,想到封装一个能调用通用的回调函数的函数,类似于 OnFileChange(whichFile, callback),当第一个参数指定的文件发生变化时调用第二个参数传入的函数来处理这个事件。直觉上觉得go还可以有其他方式来优雅实现这种需求。

这个函数支持传入一个回调函数作为参数,回调函数的参数不确定,返回值不确定,只能把参数和返回值都定义为interface{},然后通过reflect进行处理

代码如下:

package main

import (
    "fmt"
    "reflect"
)

func F(callback interface{}, args ...interface{}) {
    v := reflect.ValueOf(callback)
    if v.Kind() != reflect.Func {
        panic("not a function")
    }
    vargs := make([]reflect.Value, len(args))
    for i, arg := range args {
        vargs[i] = reflect.ValueOf(arg)
    }

    vrets := v.Call(vargs)

    fmt.Print("\tReturn values: ", vrets)
}

func CB1() {
    fmt.Println("CB1 called")
}

func CB2() bool {
    fmt.Println("CB2 called")
    return false
}

func CB3(s string) {
    fmt.Println("CB3 called")
}

func CB4(s string) (bool, int) {
    fmt.Println("CB4 called")
    return false, 1
}

func main() {
    F(CB1)
    F(CB2)
    F(CB3, "xxx")
    F(CB4, "yyy")
}

程序输出:

CB1 called
    Return values: []
CB2 called
    Return values: [<bool Value>]
CB3 called
    Return values: []
CB4 called
    Return values: [<bool Value> <int Value>]

如果您觉得从我的分享中得到了帮助,并且希望我的博客持续发展下去,请点击支付宝捐赠,谢谢!

若非特别声明,文章均为阿小信的个人笔记,转载请注明出处。文章如有侵权内容,请联系我,我会及时删除。

#Golang#   阅读[6051] 评论[0]

你可能也感兴趣的文章推荐

本文最近访客

网友185.*.*.22[火星]2022-06-30 05:53
网友51.*.*.12[火星]2022-06-30 05:52
网友157.*.*.144[Redmond]2022-06-30 05:44
网友185.*.*.3[火星]2022-06-30 05:37

发表评论