我想声明一个变量,它是指向具有未知签名的函数的指针。
例如,要声明一个变量,该变量可以包含指向可以设置为 log.Printf 的函数的指针,我可以这样做:
var foo func(format string, v ...any)
...
foo = log.Printf
但这假设函数签名是已知的 - 在 C++ 中我会使用
decltype
但我在 Go 中找不到类似的东西。我尝试反射但无法使其工作。
有人有什么想法吗?
将反射与接口结合使用,这样您就可以通过接口使用任何函数。我做了一些改变并在操场上进行了测试
func main() {
var foo interface{}
foo = log.Printf
dynamicFunction(foo, "Pointer, %s!", "Test")}
func dynamicFunction(fn interface{}, args ...interface{}) {
v := reflect.ValueOf(fn)
in := make([]reflect.Value, len(args))
for i, arg := range args {
in[i] = reflect.ValueOf(arg)
}
v.Call(in)}