2 回答
TA贡献1829条经验 获得超4个赞
看起来您正在尝试在 Go 中重新创建类继承。Go 故意没有类继承。不要试图重新创建它。我相信您在想“国家是基地”。那是不正确的。国家嵌入基地。那不是一回事。这对你如何命名事物很重要。在这种情况下,“基地”似乎真的是“位置元数据”,所以我们就这样称呼它。
type LocationMeta struct {
id string
name string
code string
}
而且您需要一个适用于各种位置的界面。
type Location interface {
Id() string
Name() string
Code() string
}
我们可以使 LocationMeta 符合 Location,尽管这可能有点奇怪(元数据真的是Location 吗?)。但它有效。
func (b LocationMeta) Id() string {
return b.id
}
func (b LocationMeta) Name() string {
return b.name
}
func (b LocationMeta) Code() string {
return b.code
}
我们可以将 LocationMeta 嵌入城市中:
type City struct {
LocationMeta
}
而且免费的是,City 现在符合 Location。
也就是说,通常你不会为这么小的没有逻辑的东西而烦恼这种嵌入。那真是太过分了;我只是在演示它,因为您似乎正在使用它。通常,您只需符合每种类型本身:
type Country struct {
id string
name string
code string
}
func (c Country) Id() string {
return c.id
}
func (c Country) Name() string {
return c.name
}
func (c Country) Code() string {
return c.code
}
Go 的伟大之处在于它不关心你如何符合接口。City 和 Country 都以完全不同的方式符合 Location,这完全没问题。
所以你可以创建一个城市:
boston := City{LocationMeta{id: "bos", name: "Boston", code: "bos"}}
看看这有多奇怪?由于嵌入对象,我们必须创建一个 LocationMeta。有时它是值得的(而且非常强大),但我可能会以乡村方式(没有 LocationMeta)完成城市和乡村:
us := Country{id: "us", name: "USA", code: "us"}
但是,它们都是位置,因此我们可以将它们放在一个切片中:
locations := []Location{boston, us}
并将它们传递给事物:
func printLocations(locations []Location) {
fmt.Println(locations)
}
printLocations(locations)
TA贡献1850条经验 获得超11个赞
我已经在评论中发布了这个,但你可以这样做
func myfunc(in interface{}) {
switch in.(type) {
case []Country:
// country logic here
case []City:
// city logic here
}
}
- 2 回答
- 0 关注
- 112 浏览
添加回答
举报