type Msg[T any] interface {
*T
proto.Message
}
func Handle[T any, U Msg[T]](cb func(req U) (proto.Message, error)) {
msg := new(T)
if err := proto.Unmarshal([]byte{}, msg); err != nil {
}
_, _ = cb(msg)
}
func main() {
Handle(donSomething)
}
func doSomething(req *pb.Hello) (proto.Message, error) {
_ = proto.Unmarshal([]byte{}, req)
return nil, nil
}
为什么 proto.Unmarshal 无法使用“msg”(类型 *T)作为 Handle 泛型函数中的 Message 类型。
如何在带有 protobuf 的通用函数中使用 new(T)
最佳答案
在您的程序中,T
受到 any
的约束,因此指针类型 *T
不再与 protobuffer 类型相关。它只是一个指向未指定类型的指针。
改为使用:
msg := U(new(T))
这样你就有了一个非零指针,指向任何 T
被推断的内容 - 这里它将是 pb.Hello
, new(T)
创建一个指向 pb.Hello
零值的指针,并且转换 U()
告诉编译器 *T
确实满足 proto.Message
接口(interface)。
关于golang protobuf 无法在泛型类型中解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76864765/