我正试图将一些C移植到Go.
我基本上在寻找类似于Haskell的东西 find :: (a -> Bool) -> [a] -> Maybe a
我(大致)这个C用于通过迭代查找"列表"中的项目:
struct foo { struct foo *next; char *name; } struct foo *foo_list; // Snip struct foo *foo = NULL; for (f = foo_list; f; f = f->next) { if (!strcmp("bar", f->name) { foo = f; } } if (foo) // Stuff
我怎么能在Go中很好地和惯用地做到这一点?
"名单"可能很小; 性能特征不是特别有趣.
我可能想要一个slice
或一个list
?Foo
s或*Foo
s的"列表" ?
我目前有以下内容,但我怀疑它不是特别"惯用Go"!
var FooTable *list.List // Snip var foo *Foo = nil for e := FooTable.Front(); e != nil; e = e.Next() { if e.Value.(*Foo).name == "bar" { foo = e.Value.(*Foo) break } }
Nick Craig-W.. 6
对于惯用的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很高兴为我实际遇到的人回答一个问题!
对于惯用的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很高兴为我实际遇到的人回答一个问题!