我正在尝试将一些 C 移植到 Go。我本质上是在寻找类似于 Haskell 的东西 find :: (a -> Bool) -> [a] -> Maybe a我有(粗略地)这个 C 用于通过迭代在“列表”中查找项目:struct foo { struct foo *next; char *name;}struct foo *foo_list;// Snipstruct foo *foo = NULL;for (f = foo_list; f; f = f->next) { if (!strcmp("bar", f->name) { foo = f; }}if (foo) // Stuff我怎样才能在 Go 中很好地、惯用地做到这一点?“名单”可能很小;性能特征不是特别有趣。我可能想要一个slice,还是一个list?Foos 或*Foos 的“列表” ?我目前有以下内容,但我怀疑它不是特别“惯用的围棋”!var FooTable *list.List// Snipvar foo *Foo = nilfor e := FooTable.Front(); e != nil; e = e.Next() { if e.Value.(*Foo).name == "bar" { foo = e.Value.(*Foo) break }}
1 回答
Helenr
TA贡献1780条经验 获得超3个赞
对于惯用的 Go,您需要一个指向的指针Foo(尽管如果 Foo 非常小,您可能只选择一个Foo),所以
var foos []*Foo
然后搜索
var found *Foo
for _, foo := range foos {
if foo.name == "bar" {
found = foo
break
}
}
if found != nil {
// stuff
}
如果你经常这样做,你会用一些像这样的类型来包装它
type Foos []*Foo
func (fs Foos) find(what string) (foo *Foo) {
for _, foo = range foos {
if foo.name == what {
return foo
}
}
return nil
}
然后你可以做
var foos Foos
foo := foos.find("bar")
if foo != nil {
// something
}
PS 很高兴为我实际遇到的人回答问题!
- 1 回答
- 0 关注
- 177 浏览
添加回答
举报
0/150
提交
取消