猿问

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

package main


import (

    "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


DIEA
浏览 800回答 1
1回答

12345678_0001

不确定您是否需要泛型...但让我们解决您的编译错误:invalid composite literal type T以及关于复合文字的Go 规范:LiteralType 的核心类型 T 必须是结构、数组、切片或映射类型(语法强制执行此约束,除非类型作为 TypeName 给出)。有问题的代码是:type MessageParse[T proto.Message] struct {}func (p *MessageParse[T]) Parse(message *NetMessage) proto.Message {&nbsp; &nbsp; protoT := &T{} // <- here泛型类型T受限于类型proto.Message。查看类型proto.Message (它是类型protoreflect.ProtoMessage的别名)表明它是 Gointerface类型而不是核心类型。因此它不能用于实例化复合文字。您会在非泛型示例中遇到相同的编译错误,例如:type mytype interface {&nbsp; &nbsp; SomeMethod() error}_ = &mytype{}&nbsp; // // ERROR: invalid composite literal type mytype
随时随地看视频慕课网APP

相关分类

Go
我要回答