我正试图将一些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
Run Code Online (Sandbox Code Playgroud)
我怎么能在Go中很好地和惯用地做到这一点?
"名单"可能很小; 性能特征不是特别有趣.
我可能想要一个slice或一个list?Foos或*Foos的"列表" ?
我目前有以下内容,但我怀疑它不是特别"惯用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
}
}
Run Code Online (Sandbox Code Playgroud)
对于惯用的Go,你需要一些指针Foo(尽管如果Foo非常小,你可能只选择一片Foo),所以
var foos []*Foo
Run Code Online (Sandbox Code Playgroud)
然后进行搜索
var found *Foo
for _, foo := range foos {
if foo.name == "bar" {
found = foo
break
}
}
if found != nil {
// stuff
}
Run Code Online (Sandbox Code Playgroud)
如果你这么做很多,你会用一些类似的东西把它包起来
type Foos []*Foo
func (fs Foos) find(what string) (foo *Foo) {
for _, foo = range foos {
if foo.name == what {
return foo
}
}
return nil
}
Run Code Online (Sandbox Code Playgroud)
那你可以做
var foos Foos
foo := foos.find("bar")
if foo != nil {
// something
}
Run Code Online (Sandbox Code Playgroud)
PS很高兴为我实际遇到的人回答一个问题!
| 归档时间: |
|
| 查看次数: |
83 次 |
| 最近记录: |