猿问

通过遍历 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 中很好地、惯用地做到这一点?


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


我可能想要一个slice,还是一个list?Foos 或*Foos 的“列表” ?


我目前有以下内容,但我怀疑它不是特别“惯用的围棋”!


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

    }

}


慕尼黑5688855
浏览 178回答 1
1回答

Helenr

对于惯用的 Go,您需要一个指向的指针Foo(尽管如果 Foo 非常小,您可能只选择一个Foo),所以var foos []*Foo然后搜索var found *Foofor _, foo := range foos {    if foo.name == "bar" {        found = foo        break    }}if found != nil {    // stuff}如果你经常这样做,你会用一些像这样的类型来包装它type Foos []*Foofunc (fs Foos) find(what string) (foo *Foo) {    for _, foo = range foos {        if foo.name == what {            return foo        }    }    return nil}然后你可以做var foos Foosfoo := foos.find("bar")if foo != nil {    // something}PS 很高兴为我实际遇到的人回答问题!
随时随地看视频慕课网APP

相关分类

Go
我要回答