golang 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
}
почему proto.Unmarshal Невозможно использовать «msg» (тип *T) в качестве типа «Сообщение» в универсальной функции «Обработка».
как я могу использоватьnew(T)
в общей функции с protobuf
1 ответ
В вашей программе ограниченоany
, поэтому тип указателя больше не имеет никакого отношения к типу протобуфера. Это просто указатель на неопределенный тип.
Вместо этого используйте:
msg := U(new(T))
Таким образом, у вас есть ненулевой указатель на что угодно.T
подразумевается — вот оно будет,new(T)
создает указатель наpb.Hello
нулевое значение и преобразованиеU()
сообщает компилятору, что*T
действительно удовлетворяетproto.Message
интерфейс.