原始需求是这样的:我需要监听一个json文件是否发生变化,一旦发生变化就重新调用函数读取文件中新的json来更新一个变量。
现在的需求是想把这种监听到某个事件自动就调用一个函数来处理的通用写法,实现一个能调用通用的回调函数的函数,
类似于 OnFileChange(whichFile, callback)
,当第一个参数指定的文件发生变化时调用第二个参数传入的函数来处理这个事件。
这个函数支持传入一个回调函数作为参数,回调函数的参数不确定,返回值不确定,
参数和返回值都定义为interface{}
,然后通过 reflect 进行处理。
代码如下:
package main
import (
"fmt"
"reflect"
)
func RunAnyFunc(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.Println("\tReturn values: ", vrets)
}
func func1() {
fmt.Println("func1 called")
}
func func2() bool {
fmt.Println("func2 called")
return false
}
func func3(s string) {
fmt.Println("func3 called")
}
func func4(s string) (bool, int) {
fmt.Println("func4 called")
return false, 1
}
func main() {
RunAnyFunc(func1)
RunAnyFunc(func2)
RunAnyFunc(func3, "xxx")
RunAnyFunc(func4, "yyy")
}
程序输出:
func1 called
Return values: []
func2 called
Return values: [<bool Value>]
func3 called
Return values: []
func4 called
Return values: [<bool Value> <int Value>]