通过遍历Go列表来查找项目

时间:2015-12-26 14:06:05

标签: go

我正在尝试将一些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中很好地和惯用地做到这一点?

“清单”可能很小;性能特征并不是特别有趣。

我可能想要slicelist吗? Foo*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
    }
}

1 个答案:

答案 0 :(得分: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很高兴为我实际遇到过的人回答一个问题!