Slide 26
Slide 26 text
生成されたClientのコードをそのまま利用するには
type Module struct {
Service interface{}
}
func (m *Module) Invoke(ctx context.Context, method string, args interface{}, reply interface{}, opts
...grpc.CallOption) error {
split := strings.Split(method, "/")
// method -> "/snkrdunk.search.v1.SearchService/ListSuggestions"
// split -> []string{"", "snkrdunk.search.v1.SearchService", "ListSuggestions"}
inputs := []reflect.Value{
reflect.ValueOf(ctx),
reflect.ValueOf(args),
}
outs := reflect.ValueOf(m.Service).MethodByName(split[2]).Call(inputs)
// outs[0]がZero ValueだとpanicになるのでIsZero()でチェック, reflect: call of reflect.Value.Set on zero Value
if !outs[0].IsZero() {
reflect.ValueOf(reply).Elem().Set(outs[0].Elem())
}
err, _ := outs[1].Interface().(error)
return err
}
func (m *Module) NewStream(ctx context.Context, desc *grpc.StreamDesc, method string, opts ...grpc.CallOption)
(grpc.ClientStream, error) {
// Streamは使用しないのでエラーを返す
return nil, status.Error(codes.Unknown, "stream not supported")
}