go中获取不同属性的通用函数

时间:2014-07-10 08:38:40

标签: generics go

我有这样的代码:

package main

import "fmt"

type Foo struct {
    foo_id int
    other_id int
    one_more_id int
}

type Bar struct {
    bar_id int
}

func ids(???) []int { ??? }

func main() {   
    foos := {Foo{1},Foo{3}}
    bars := {Bar{1},Bar{3}}
    fmt.Println(ids(foos, ???)) // get foo_id
    fmt.Println(ids(foos, ???)) // get other_id
    fmt.Println(ids(foos, ???)) // get one_more_id
    fmt.Println(ids(bars, ???)) // get bar_id
}

我想让ids通用,能够传递任何结构和某种方式(闭包?)和我需要检索的属性。这样做有意义吗?或者也许我应该使用不同的方法?

编辑: 我的问题太过暧昧,我必须清除它: 根据需要,ids函数应该能够从struct中获取多个字段,因为我更新了上面的代码。

2 个答案:

答案 0 :(得分:5)

使用界面是否符合您的要求....

https://play.golang.org/p/aQiw-D4ME5

package main

import "fmt"

type ThingWithID interface {
    ID() int
}

type Foo struct {
    foo_id int
}

func (f Foo) ID() int {
    return f.foo_id
}

type Bar struct {
    bar_id int
}

func (b Bar) ID() int {
    return b.bar_id
}

func ids(things []ThingWithID) []int { 
    ia := []int{}
    for _,t := range things {
        ia = append(ia, t.ID())
    } 
    return ia
}

func main() {   
    foos := []ThingWithID{Foo{1}, Foo{3}}
    bars := []ThingWithID{Bar{2}, Bar{5}}
    bazs := []ThingWithID{Bar{3}, Foo{4}, Bar{6}}

    fmt.Println(ids(foos)) // get foo_id [1 3]
    fmt.Println(ids(bars)) // get bar_id [2 5]
    fmt.Println(ids(bazs)) // get bar_id, foo_id, bar_id [3 4 6]
}

答案 1 :(得分:2)

这适用于您的情况:

func ids(gens []interface{}) []int {
    ids := []int{}
    for _, i := range gens {
        switch foobar := i.(type) {
            case Foo:
                ids = append(ids, foobar.foo_id)
            case Bar:
                ids = append(ids, foobar.bar_id)
            default:
                continue
        }
    }
    return ids
}

Playground Link。我在这个例子中使用Type Switch。如果您不知道期望哪种类型,则需要使用reflect package。但是您无法访问示例中定义的未导出字段。