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

标签 callback go type-safety type-assertion

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

相关文章:

javascript - Android 版谷歌地图

java - 如何在Android中定义自定义事件和事件监听器?

android - 如何从android库回调到各种 Activity

http - 如何有效解决 'Max Out'并发HTTP请求?

typescript - 有没有办法在 TypeScript 中表示非负整数,以便编译器可以防止使用分数和负数?

javascript - 处理 Angular 1.5 组件中的回调函数

http - 如何将 context.Done() 与嵌套的 http 中间件一起使用

time - Golang - 如何在特定时间执行功能

java - 这个函数如何不违反Java类型安全要求?

java - 未经检查强制转换为实现 Map<String, V> 的泛型类