Go gRPC嵌入UnimplementedServer与自定义接口引发编译歧义问题
问题根因
这是Go嵌入类型的方法集冲突导致的编译错误:
- 你的
MyServer结构体同时匿名嵌入了两个拥有同名同签名方法的类型:自定义CoreApi接口、gRPC生成的proto.UnimplementedCoreServer结构体,二者都定义了CreateThing方法。 - Go编译器遇到同名的嵌入方法时无法自动判断该提升哪个方法到外层结构体,会直接标记为
ambiguous(歧义)错误,最终判定MyServer没有实现CoreServer接口要求的CreateThing方法。
解决方案
最稳妥兼容的解决方式是给MyServer显式定义CreateThing方法,手动转发到你的业务实现,直接消除歧义:
在cmd/service.go中添加如下方法:
func (s *MyServer) CreateThing(ctx context.Context, t *proto.Thing) (*proto.ThingResponse, error) { return s.CoreApi.CreateThing(ctx, t) }
外层显式定义的方法优先级高于嵌入类型的方法,编译时会直接采用该方法实现,不会再触发歧义校验。
如果需要保留接口注入能力同时不想额外写转发方法,也可以调整嵌入方式屏蔽UnimplementedCoreServer的方法提升:
// 注意该方案需要确保UnimplementedCoreServer的私有mustEmbed方法被继承,适配gRPC接口校验规则 type MyServer struct { CoreApi // 不使用匿名嵌入,改为具名空白标识符字段,方法不会被提升到外层 _ proto.UnimplementedCoreServer }
内容的提问来源于stack exchange,提问作者Jeffe
相关产品推荐
相关产品推荐

