想象一下我有这两个结构:
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 在用“这个问题已经有一个答案”标记它之前,它不是同一个问题,因为在下面的问题中,结构之间的字段名称不同。
当我准备问题时,我突然想到我可以实现这样的事情:
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)