gpt4 book ai didi

callback - 如何对 interface{} 变量进行类型断言以测试它是否是函数?

转载 作者:IT王子 更新时间:2023-10-29 01:53:10 25 4
gpt4 key购买 nike

我正在尝试编写一个接受某种类型的任意类型内容的函数,或者一个可以生成并返回任意类型的函数。为此,我必须能够在不测试参数是否为返回类型 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
}

playground

关于callback - 如何对 interface{} 变量进行类型断言以测试它是否是函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26222456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com