反射 - 方法调用恐慌与"调用reflect.Value.Elem对struct value"

时间:2017-06-15 11:25:34

标签: go go-reflect

以下是代码段 -

type Gateway struct {
    Svc1 svc1.Interface
    Svc2 svc2.Interface
}

func (g *Gateway) GetClient(service string) interface{} {
    ps := reflect.ValueOf(g)
    s := ps.Elem()
    f := s.FieldByName(strings.Title(service))
    return f.Interface()
}

func (g *Gateway) Invoke(service string, endpoint string, args... 
    interface{}) []reflect.Value {
    log.Info("Gateway.Invoke " + service + "." + endpoint)
    inputs := make([]reflect.Value, len(args))
    for i, _ := range args {
        inputs[i] = reflect.ValueOf(args[i])
    }

    client := g.GetClient(service)

    return reflect.ValueOf(client).Elem().MethodByName(endpoint).Call(inputs)
}

GetClient(" svc1")运行正常。

但是,当我调用Invoke(" svc1"," endpoint1",someArg)时,它会惊慌地说 -

reflect: call of reflect.Value.Elem on struct Value

reflect.ValueOf(client).MethodByName(endpoint).Call(输入)恐慌说调用零值。

1 个答案:

答案 0 :(得分:1)

有几个问题:

  1. 如果svc1.Interface不是指针或界面,reflect.Value.Elem()会发生恐慌(请参阅https://golang.org/pkg/reflect/#Value.Elem

  2. 如果endpoint Invoke参数字符串与目标方法的大小写不匹配,则由于零值(invalid reflect.Value)而导致混乱。请注意,必须导出要调用的方法。