为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
呼啦一阵风 2023-06-12 17:27:25
我有多个结构type Base struct {     Id string     Name string     Code string}type Country struct {     Base     ... }type City struct {     Base     ... }我需要创建一个包含城市或国家/地区数组的函数。目前,我为每种类型都有一个功能,它正在做同样的事情,我想这不是最好/好的方法!
查看完整描述

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)


查看完整回答
反对 回复 2023-06-12
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

我已经在评论中发布了这个,但你可以这样做


func myfunc(in interface{}) {

    switch in.(type) {

    case []Country:

        // country logic here

    case []City:

        // city logic here

    }

}


查看完整回答
反对 回复 2023-06-12
  • 2 回答
  • 0 关注
  • 116 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信