当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《通过遍历Go列表来查找项目》经验,为你挑选了1个好方法。

我正试图将一些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或一个listFoos或*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
    }
}

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很高兴为我实际遇到的人回答一个问题!



1> Nick Craig-W..:

对于惯用的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很高兴为我实际遇到的人回答一个问题!


请注意,如果搜索到的元素不在切片中,则您的`foo`变量将保存切片的最后一个元素,当然不是您想要的.
推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有