Golang DRY用于嵌套结构

时间:2016-09-04 08:42:28

标签: go struct dry

我有一个BaseEntity结构和一个带有* BaseEntity接收器的方法,它从文件中分析xml

type BaseEntity struct {
   FilePath   string
   Collection string
}

func (this *BaseEntity) Parse() *[]byte {
    xmlFile, err := ioutil.ReadFile(this.FilePath)
    if err != nil {
       fmt.Println("Error opening file:", err)
       return nil
    }
    return &xmlFile
}

我也有几个嵌入BaseEntity的结构,例如。用户,帖子,评论,标签......等

type Users struct {
    Data []User `xml:"row"`
    BaseEntity
}
type User struct {
    WebsiteUrl      string `xml:"WebsiteUrl,attr"`
    UpVotes         string `xml:"UpVotes,attr"`
    Id              string `xml:"Id,attr"`
    Age             string `xml:"Age,attr"`
    DisplayName     string `xml:"DisplayName,attr"`
    AboutMe         string `xml:"AboutMe,attr"`
    Reputation      string `xml:"Reputation,attr"`
    LastAccessDate  string `xml:"LastAccessDate,attr"`
    DownVotes       string `xml:"DownVotes,attr"`
    AccountId       string `xml:"AccountId,attr"`
    Location        string `xml:"Location,attr"`
    Views           string `xml:"Views,attr"`
    CreationDate    string `xml:"CreationDate,attr"`
    ProfileImageUrl string `xml:"ProfileImageUrl,attr"`
}

func (this *Users) LoadDataToDB() {

    file := this.Parse()
    xml.Unmarshal(*file, &this)

    // Init db
    db := database.MgoDb{}
    db.Init()
    defer db.Close()

    for _, row := range this.Data {
        err := db.C(this.Collection).Insert(&row)
        if err != nil {
            fmt.Println(err)
        }
    }
}

对于每个结构,我需要创建一个方法LoadDataToDB,它在db中加载数据并有一些代码。

这个方法不能有* BaseEntity接收器,因为我无法在base结构中得到this.Data,我不能从参数中获取这个结构,因为它总是一个不同的结构。

如何干掉并将这个重复方法从每个嵌入式结构移动到一个?

0 个答案:

没有答案