我正在尝试编写一个接受某种类型的任意类型内容的函数,或者一个可以生成并返回任意类型的函数。为此,我必须能够在不测试参数是否为返回类型 X 的函数的情况下测试参数是否为函数。我该怎么做?可能类似于以下内容:
func Blah(arbitrary interface{}) {
var value interface{}
if function, ok := arbitrary.(func interface{}); ok {
value = function()
} else {
value = arbitrary
}
...
}
这失败了。也许类型断言不是这里要使用的东西。或者也许我只是不知道语法。将不胜感激任何建议。目前我唯一知道要做的就是将其分为两个函数,一个接受按原样存储的数据,另一个期望获得一个函数,但这似乎有点过分,因为在这两种情况下,目标都只是为了获得一个值并将其传递给函数的其余部分。
对此有什么想法吗?
最佳答案
类型断言适用于特定类型。如果您知道函数的类型总是 func() interface{}
类型,那么您可以使用:
if f, ok := arbitrary.(func() interface{}) {
value = f()
} else {
value = arbitrary
}
请注意,func() interface{}
类型是具有返回类型 interface{}
的函数,而不是具有任意返回类型的函数。
很容易将任意函数包装到 func() 接口(interface){}
:
func hello() string { return "hello" }
wrapped := func() interface{} { return hello() }
如果你不能安排函数有返回类型interface{}
,那么你需要使用反射来测试和调用函数:
func isFunction(v interface{}) (func() interface{}, bool) {
rv := reflect.ValueOf(v)
if rv.Kind() == reflect.Func {
return func() interface{} {
result := rv.Call(nil)
if len(result) > 0 {
return result[0].Interface()
}
return nil
}, true
}
return nil, false
}
---
if f, ok := isFunction(arbitrary); ok {
value = f
} else {
value = arbitrary
}
关于callback - 如何对 interface{} 变量进行类型断言以测试它是否是函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26222456/