package mainimport ( "google.golang.org/protobuf/proto")type NetMessage struct { Data []byte}type Route struct {}type AbstractParse interface { Parse(*NetMessage) proto.Message}type MessageParse[T proto.Message] struct {}func (p *MessageParse[T]) Parse(message *NetMessage) proto.Message { protoT := &T{} if len(message.Data) > 0 { err := proto.Unmarshal(message.Data, protoT) if err != nil { return nil } } return protoT}当我尝试对 Go 进行通用编码时,我遇到了这个问题:./prog.go:23:13: 无效复合文字类型 T原因是什么?有什么办法可以解决吗?代码链接: https: //go.dev/play/p/oRiH2AyaYb6
1 回答

12345678_0001
TA贡献1802条经验 获得超5个赞
不确定您是否需要泛型...但让我们解决您的编译错误:
invalid composite literal type T
以及关于复合文字的Go 规范:
LiteralType 的核心类型 T 必须是结构、数组、切片或映射类型(语法强制执行此约束,除非类型作为 TypeName 给出)。
有问题的代码是:
type MessageParse[T proto.Message] struct {}
func (p *MessageParse[T]) Parse(message *NetMessage) proto.Message {
protoT := &T{} // <- here
泛型类型T受限于类型proto.Message。查看类型proto.Message (它是类型protoreflect.ProtoMessage的别名)表明它是 Gointerface类型而不是核心类型。因此它不能用于实例化复合文字。
您会在非泛型示例中遇到相同的编译错误,例如:
type mytype interface {
SomeMethod() error
}
_ = &mytype{} // // ERROR: invalid composite literal type mytype
- 1 回答
- 0 关注
- 799 浏览
添加回答
举报
0/150
提交
取消