在reflect.MakeFunc

时间:2016-12-24 01:17:27

标签: go reflection

我正在尝试在golang中创建一个返回函数,其返回类型为(SomeStruct,error)(标准错误接口)

fn := func (args []reflect.Value) []reflect.Value {
    database := mongoConnectorInstance.GetDatabase()
    defer database.Session.Close()

    selector := bson.M{
        field : args[0].Interface(),
    }

    newValue := reflect.New(fieldFunctionValue.Type().Out(0))
    newValueInterface := newValue.Interface()
    fmt.Println(reflect.TypeOf(newValueInterface))

    err := database.C(collection).Find(selector).One(newValueInterface)

    secondValue := reflect.ValueOf(err)
    return []reflect.Value {
        newValue.Elem(),
        secondValue,
    }
}

resultFunctionValue := reflect.MakeFunc(fieldFunctionValue.Type(), fn)

如果.One函数返回的错误为null,我在golang内部得到地址指针错误:

panic("reflect: function created by MakeFunc using " + funcName(f) +
                    " returned wrong type: have " +
                    out[i].typ.String() + " for " + typ.String())

我试图将secondValue赋值行更改为:

secondValue := reflect.ValueOf((error)(nil)) 

err == nil的情况下,但问题并没有消失。

如果我创建一个实现接口错误的虚假错误结构并返回该错误,那么当它真的为零时忽略错误返回值必须为nil,然后它会抱怨the return value by the function made by makeFunc is incorrect

你能想出解决这个问题的方法吗? (除非在结构中包装错误,而是将返回类型更改为该结构)

1 个答案:

答案 0 :(得分:1)

使用此行设置secondValue

secondValue := reflect.ValueOf(&err).Elem()

致电ValueOf(&err)会返回reflect.Value类型*error。在该值上调用Elem()将返回reflect.Value类型error

如果ValueOf(err)中没有具体值,则调用reflect.Value将返回err,其具有具体值reflect.Value或无效err的类型(err == nil)。无论哪种方式,返回的reflect.Value都没有error类型。