golang protobuf 无法在泛型类型中解码

标签 go generics protobuf-go go-generate

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/

相关文章:

java - Valhalla 的值对象可以保存泛型类型并在它们是原始类型时将其扁平化吗?

java - Java 的 Enum 声明的含义是什么?

go - 为什么在 go lang 中对关键字进行严格的代码格式

xml - 如何使用 Golang 解码 Reddit 的 RSS?

go - 为什么我的两个 slice 之一会因“运行时错误:索引超出范围”而感到 panic ?

swift - 为通用结构提供专门的初始化器

c - 如何从 C 库中检索 probuf

Golang grpc.server : Understanding notions of server, 和服务

go - 在Golang中解码Protobuf(proto2)后如何设置可选参数?

go - 具有上下文支持的 socks5 代理客户端