-2

我是 Go 新手,使用gowsdl基于NetSuite SuiteTalk Web 服务定义生成的一组类型。它创建了以下类型:

type BaseRef struct {
    XMLName xml.Name `xml:"urn:core_2018_2.platform.webservices.netsuite.com BaseRef"`
    Name string `xml:"name,omitempty"`
}

type RecordRef struct {
    XMLName xml.Name `xml:"urn:core_2018_2.platform.webservices.netsuite.com   RecordRef"`
    *BaseRef
    InternalId string `xml:"internalId,attr,omitempty"`
    ExternalId string `xml:"externalId,attr,omitempty"`
    Type *RecordType `xml:"type,attr,omitempty"`
}

type GetRequest struct {
    XMLName xml.Name `xml:"urn:messages_2018_2.platform.webservices.netsuite.com GetRequest"`
    BaseRef *BaseRef `xml:"baseRef,omitempty"`
}

当我尝试使用这些类型时,我无法在 GetRequest 结构中使用特定类型的参考记录,该结构正在寻找 RecordRef 所基于的 BaseRef。

var partnerRecordType RecordType
partnerRecordType = RecordTypePartner
recordRef := RecordRef{
    Type:&partnerRecordType,
    InternalId:internalIdString,
}

var getRequest GetRequest
getRequest.BaseRef = &recordRef

我得到的错误在最后一行是:

cannot use &recordRef (type *RecordRef) as type *BaseRef in assignment

关于如何进行的任何想法?

4

2 回答 2

1

Go 不支持这种方式的多态性,也不支持 C# 或 Java 支持的继承方式。嵌入式结构实际上只是嵌入式的,它们不会创建经典的继承层次结构。他们只是为包装结构提供了嵌入结构的所有公开方法和字段(有一些微妙的警告 - 查看规范

也就是说,在您的示例中,它的类型与它RecordRef无关BaseRef,而是可以认为它“包含”指向 a 的指针BaseRef。为了让您的程序能够编译,您将BaseRef像这样显式分配嵌入式:

getRequest.BaseRef = &recordRef.BaseRef

GetRequest由于您引用的这段代码是从 WSDL 自动生成的,因此更新 以以更多态、更灵活的方式提供类似的数据结构可能有点麻烦BaseRef,但为了这样做,您需要使用 Go 接口.

您可以更新GetRequest以在接口类型中具有接受的方法,例如XmlRef这将公开可以派生您需要分配给GetRequest

例如

type XmlRef interface {
  Name() string
  InternalID() string
  ExternalID() string
}

func (r *GetRequest) SetRef(ref XmlRef) {
  r.BaseRef.Name = ref.Name()
  // etc...
}

然后简单地实现接口RecordRef和任何其他需要在此上下文中使用的结构。

于 2019-01-04T00:21:17.240 回答
0

如果我理解正确,您正在寻找一种访问 astruct嵌入字段的方法。您可以简单地recordRef.BaseRef用于该目的。

进一步阅读:https ://golang.org/ref/spec#Struct_types

于 2019-01-04T00:21:08.073 回答