I am writing a function using reflect.MakeFunc. That function can return an error. When it succeeds, I want it to return nil for its error-typed return value. How can I do that using reflect? Currently I have this:
package main
import (
"fmt"
"reflect"
"errors"
)
func main() {
fmt.Println("Hello, playground")
f := func() error {return nil}
fn := reflect.MakeFunc(reflect.TypeOf(f), func(args []reflect.Value) []reflect.Value {
return []reflect.Value{reflect.New(reflect.TypeOf(errors.New("")))}
}).Interface().(func() error)
fmt.Printf("err: %v", fn())
}
I get panic: reflect: function created by MakeFunc using closure returned wrong type: have **errors.errorString for error
. I also tried adding a .Elem()
after reflect.New(reflect.TypeOf(errors.New("")))
, but I got panic: reflect: function created by MakeFunc using closure returned wrong type: have *errors.errorString for error
. I tried .Elem().Elem()
, and I got a segmentation fault.
How can I get a reflect.Value representing a nil error?