Golang - 对具有相同字段的两个结构使用相同函数的最佳实践

Ser*_*nov 5 methods struct go

想象一下我有这两个结构:

type Game struct {
    Name string
    MultiplayerSupport bool
    Genre string
    Version string
}

type ERP struct {
    Name string
    MRPSupport bool
    SupportedDatabases []string
    Version string
}
Run Code Online (Sandbox Code Playgroud)

我想要一个附加到这些结构的函数来打印Version变量

func (e *ERP) PrintVersion()  {
    fmt.Println("Version is", e.Version)
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用接口,但我仍然必须为这两个结构定义两个相同的函数,这是代码重复。

防止代码重复的最佳实践是什么?

PS 在用“这个问题已经有一个答案”标记它之前,它不是同一个问题,因为在下面的问题中,结构之间的字段名称不同。

使用具有不同结构的相同函数的最佳实践 - Golang

Ser*_*nov 4

当我准备问题时,我突然想到我可以实现这样的事情:

type Version string

func (v Version) PrintVersion() {
    fmt.Println("Version is", v)
}
Run Code Online (Sandbox Code Playgroud)

因为所有自定义类型(不仅是结构)都可以是方法接收者。

然后我可以使用组合在结构上使用这种类型:

type Game struct {
    Name               string
    MultiplayerSupport bool
    Genre              string
    Version
}

type ERP struct {
    Name               string
    MRPSupport         bool
    SupportedDatabases []string
    Version
}
Run Code Online (Sandbox Code Playgroud)

然后我可以像普通字符串字段一样使用它(确实如此!)

func main() {

    g := Game{
        "Fear Effect",
        false,
        "Action-Adventure",
        "1.0.0",
    }

    g.PrintVersion()
    // Version is 1.0.0


    e := ERP{
        "Logo",
        true,
        []string{"ms-sql"},
        "2.0.0",
    }

    e.PrintVersion()
    // Version is 2.0.0

}
Run Code Online (Sandbox Code Playgroud)