为了账号安全,请及时绑定邮箱和手机立即绑定

Go 泛型:无效的复合文字类型 T

Go 泛型:无效的复合文字类型 T

Go
DIEA 2022-12-13 10:25:28
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


查看完整回答
反对 回复 2022-12-13
  • 1 回答
  • 0 关注
  • 646 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信