检查reflect.Type是否实现了另一个reflect.Type

时间:2017-03-28 21:31:12

标签: go reflection

嘿伙计们, 我正在为我的公司在golang创建一个库。我希望客户端向我们传递一个带有func(t)错误的回调函数; 由于Go中没有泛型,我试图通过反射检查参数和返回类型。

但我现在正在冒险。有什么帮助吗?

func check(F interface{}) bool {
    errorInterface  := reflect.TypeOf((*error)(nil)).Elem()
    if tpFunc := reflect.TypeOf(Func); tpFunc.Kind() != reflect.Func {
        return false
    } else if tpFunc.NumIn() != 1 || tpFunc.NumOut() != 1 {
        return false
    } else if tpArg := tpFunc.In(0); tpArg.Kind() != reflect.Ptr || tpArg.Elem().Kind() != reflect.Struct {
        return false
    } else if tpRet := tpFunc.Out(0); tpRet.Implements(errorInterface)  {
        return false
    }
    return true
}



type T0 struct {
   A int64
   B float
}

func F0(t *T0) error {
  ...
}

func F1(t *T0) int {
  ...
}

幸运的是,我的代码实际上与语法修正有关,正如@CeriseLimón指出的那样。 https://play.golang.org/p/nqooMtkoQ-

正如@Kaedys问的那样,我通过反思来调用F函数。

        arg0 := reflect.New(tpArg.Elem()).Interface()
        if err := json.Unmarshal(msg.Body, arg0); hadError(err) {
            hadError(toErrorQueue(msg))
        } else {
            callback := reflect.ValueOf(Func)
            args := []reflect.Value{reflect.ValueOf(arg0)}
            if errInterface := callback.Call(args)[0].Interface(); errInterface != nil && hadError(errInterface.(error)) {
                hadError(toErrorQueue(msg))
            }
        }

0 个答案:

没有答案