用于XML生成的Golang泛型

8xiog9wr  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(101)

我必须生成一个XML,我当前的代码如下:

type ReportableSeller struct {
    Identity Identity `xml:"Identity"`
}

type Identity struct {
    EntitySeller     *EntitySeller     `xml:"EntitySeller,omitempty"`
    IndividualSeller *IndividualSeller `xml:"IndividualSeller,omitempty"`
}

type EntitySeller struct {
    Standard StandardEntSeller `xml:"Standard"`
}

type IndividualSeller struct {
    Standard StandardIndSeller `xml:"Standard"`
}

type StandardEntSeller struct {
    EntSellerID EntSellerID `xml:"EntSellerID"`
}

type StandardIndSeller struct {
    IndSellerID IndSellerID `xml:"IndSellerID"`
}

type EntSellerID struct {
}

type IndSellerID struct {
}

字符串
使用这些类型,我只需添加IndividualSellerEntitySeller,如果vat已定义或未定义,则omitempty将生成正确的xml
但是我并不喜欢这样做,因为我必须定义两次Standard,并在Identity中使用这两个可空变量,而不是一个强制变量,这个想法是使用泛型。
以下是目前为止的结构:

type ReportableSeller struct {
    Identity Identity[here I need a sort of interface] `xml:"Identity"`
}

type Identity[T any] struct {
    Seller T
}

type EntitySeller struct {
    XMLName  xml.Name              `xml:"EntitySeller"`
    Standard Standard[EntSellerID]
}

type IndividualSeller struct {
    XMLName  xml.Name              `xml:"IndividualSeller"`
    Standard Standard[IndSellerID]
}

type Standard[T any] struct {
    XMLName    xml.Name   `xml:"Standard"`
    SellerID   T
}

type EntSellerID struct {
    XMLName    xml.Name   `xml:"EntSellerID"`
}

type IndSellerID struct {
    XMLName    xml.Name   `xml:"IndSellerID"`
}


这里的问题是ReportableSeller中的Identity类型需要一个泛型类型:cannot use generic type Identity[T any] without instantiation
有可能修好吗?
在C#中,我会使用继承和多态...

编辑:

与此同时,我得出了以下结论:

type Identity struct {
    Seller any
}


有了它,我可以做我需要做的,但是,不是rely类型和错误安全。

7ivaypg9

7ivaypg91#

如果我对问题的理解是正确的,你只需简单地向ReportableSeller添加类型参数,如

type ReportableSeller[T any] struct {
    Identity Identity[T] `xml:"Identity"`
}

字符串
xml.Marshal所需的示例

rs1 := ReportableSeller[IndividualSeller]{}
...
rs2 := ReportableSeller[EntitySeller]{}


PLAYGROUND
如果ReportableSeller结构是主项,我同意,但在我的情况下,它是嵌套的:type DPIBody struct { ReportableSeller []ReportableSeller "xml:"ReportableSeller"" }
尝试为结构体(ReportableSeller)实现封送拆收器,并使用一个作为DPIBody的字段:

type DPIBody struct {
    ReportableSeller []xml.Marshaler `xml:"ReportableSeller"`
}

type ReportableSeller[T any] struct {
    Identity Identity[T] `xml:"Identity"`
}

func (rs ReportableSeller[T]) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
    return e.EncodeElement(rs.Identity, start) // simple example
}


PLAYGROUND

相关问题