我有这样的代码:
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中获取多个字段,因为我更新了上面的代码。
答案 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。但是您无法访问示例中定义的未导出字段。