猿问

如何在单个函数中传递多类型数组

我有多个结构

type Base struct {
    Id string
    Name string
    Code string}
type Country struct {
    Base
    ...
}
type City struct {
    Base
    ...
}

我需要创建一个包含城市或国家/地区数组的函数。目前,我为每种类型都有一个功能,它正在做同样的事情,我想这不是最好/好的方法!


呼啦一阵风
浏览 113回答 2
2回答

浮云间

看起来您正在尝试在 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)

慕盖茨4494581

我已经在评论中发布了这个,但你可以这样做func myfunc(in interface{}) {    switch in.(type) {    case []Country:        // country logic here    case []City:        // city logic here    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答