不同命名空间中的golang常用结构体

问题描述 投票:0回答:1

我有 160 多个 .xsd 模式,对于每个文件,我使用 xsdgen 生成了 xsd.go 文件,但每个文档都有 CommonType 的公共标头。

namespace some_document

type Document struct {
    Header CommonType `xml:"header"`
        // Other fields
}


type CommonType struct {
    A  A `xml:"a"`
    B  B `xml:"b"`
    C1 C `xml:"c1"`
    C2 C `xml:"c2"`
    D  D `xml:"d"`
}

type A string

type B string

type C string

type D string

namespace any_document

type Document struct {
    Header CommonType `xml:"header"`
        // Other fields
}


type CommonType struct {
    A  A `xml:"a"`
    B  B `xml:"b"`
    C1 C `xml:"c1"`
    C2 C `xml:"c2"`
    D  D `xml:"d"`
}

type A string

type B string

type C string

type D string

此外,对于每个模式,我创建一个用于构建它的函数。我想创建一个函数 BuildHeader 并在构建器的函数中重用它。有没有办法用这种类型创建公共命名空间并使用它来代替any_document.CommonType和some_document.CommonType?我不想编辑代码生成的文件。

namespace common

type CommonType struct {
    A  A `xml:"a"`
    B  B `xml:"b"`
    C1 C `xml:"c1"`
    C2 C `xml:"c2"`
    D  D `xml:"d"`
}

type A string

type B string

type C string

type D string

我的想法:

  1. 提取“common”包中的标头并将每个文档的 CommonType 更改为 common.CommonType
  2. ...?
xml go xsd code-generation codegen
1个回答
0
投票

如果您正在处理生成的结构,则没有简单的方法可以做到这一点。但是,您可以编写一个函数来初始化公共标头并将其用于所有生成的类型,前提是它们在结构上相同。

package initializer

type CommonType struct {
  // Identical fields of the common type in all the packages
...
}

func NewCommonType() CommonType {
   // initialize an instance of CommonType
   return commonType
}

然后你可以使用:

var doc1 pkg1.Document
var doc2 pkg2.Document
...
doc1.CommonType = pkg1.CommonType(initializers.NewCommonType())
doc2.CommonType = pkg2.CommonType(initializers.NewCommonType())
© www.soinside.com 2019 - 2024. All rights reserved.