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интерфейс.

Другие вопросы по тегам