我正在尝试在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
你能想出解决这个问题的方法吗? (除非在结构中包装错误,而是将返回类型更改为该结构)
答案 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
类型。