为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕尼黑5688855 2021-11-29 19:25:10
我正在尝试将一些 C 移植到 Go。我本质上是在寻找类似于 Haskell 的东西 find :: (a -> Bool) -> [a] -> Maybe a我有(粗略地)这个 C 用于通过迭代在“列表”中查找项目:struct foo {    struct foo *next;    char *name;}struct foo *foo_list;// Snipstruct 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// Snipvar foo *Foo = nilfor e := FooTable.Front(); e != nil; e = e.Next() {    if e.Value.(*Foo).name == "bar" {        foo = e.Value.(*Foo)        break    }}
查看完整描述

1 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

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


查看完整回答
反对 回复 2021-11-29
  • 1 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信