使用 Go 定义一个可以调用任意函数的函数

原始需求是这样的:我需要监听一个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>]

也可以看看


全国大流量卡免费领

19元月租ㆍ超值优惠ㆍ长期套餐ㆍ免费包邮ㆍ官方正品