原始需求是这样的:我需要监听一个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>]
网友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
发表评论
亲~ 评论内容是必须的哟! o(∩_∩)o
昵称
邮箱
主页
评论