英文:
golang protobuf can not unmarshal in a generic type
问题
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(doSomething)
}
func doSomething(req *pb.Hello) (proto.Message, error) {
_ = proto.Unmarshal([]byte{}, req)
return nil, nil
}
为什么在 Handle 泛型函数中,proto.Unmarshal 不能将 'msg'(类型为 *T)用作 Message 类型?
如何在泛型函数中使用 new(T)
与 protobuf?
英文:
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
}
why proto.Unmarshal Cannot use 'msg' (type *T) as the type Message in Handle generic funcion.
how can i use new(T)
in a generic funcion with protobuf
答案1
得分: 2
在你的程序中,T
受到any
的限制,所以指针类型*T
与protobuf类型没有任何关系。它只是一个指向未指定类型的指针。
相反,使用以下方式:
msg := U(new(T))
这样,你就有了一个非nil的指针,指向被推断为pb.Hello
的T
类型。new(T)
创建了一个指向pb.Hello
零值的指针,而转换U()
告诉编译器*T
确实满足proto.Message
接口。
英文:
In your program T
is constrained by any
, so the pointer type *T
bears no relation to the protobuffer type anymore. It's just a pointer to an unspecified type.
Instead use:
msg := U(new(T))
This way you have a non-nil pointer to whatever T
is inferred to — here it will be pb.Hello
, new(T)
creates a pointer to a pb.Hello
zero value, and the conversion U()
tells the compiler that *T
really satisfies the proto.Message
interface.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论