代码之家  ›  专栏  ›  技术社区  ›  Colin Bowern

在Go中使用嵌入类型的基

  •  -2
  • Colin Bowern  · 技术社区  · 7 年前

    我是一个新手,可以处理由生成的一组类型 gowsdl 基于 NetSuite SuiteTalk web service definition . 它创建了以下类型:

    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结构中使用特定类型的引用记录的能力感到不满意,该结构正在寻找一个BaseRef,它是RecordRef所基于的。

    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
    

    2 回复  |  直到 7 年前
        1
  •  1
  •   syllabix    7 年前

    Go不以这种方式支持多态性,也不以C#或Java的方式支持继承。嵌入式结构实际上只是嵌入式的,它们不创建经典的继承层次结构。它们只是简单地将嵌入结构的所有公开方法和字段提供给包装结构(带有一些微妙的警告-请查看 spec )

    也就是说,在你的例子中 RecordRef BaseRef 就其类型而言,可以将其视为“包含”指向 BaseRef . 为了使您的程序能够编译,您必须显式地分配嵌入的 BaseRef 像这样:

    getRequest.BaseRef = &recordRef.BaseRef
    

    由于您引用的代码是从WSDL自动生成的,因此更新 GetRequest 提供 BaseRef

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

    type XmlRef interface {
      Name() string
      InternalID() string
      ExternalID() string
    }
    
    func (r *GetRequest) SetRef(ref XmlRef) {
      r.BaseRef.Name = ref.Name()
      // etc...
    }
    

    然后简单地实现 记录参考 以及在此上下文中需要使用的任何其他结构。

        2
  •  0
  •   leaf bebop    7 年前

    struct 这是一片肥沃的土地。你可以简单地使用 recordRef.BaseRef

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