【问题标题】:Does Go have an iterator datatype?Go 有迭代器数据类型吗?
【发布时间】:2011-09-03 07:00:29
【问题描述】:

如何编写可以在 C++ 中执行地图迭代器之类的 Go 代码?

typedef std::map<std::string, MyStruct> MyMap;
MyMap::iterator it = myMap.find("key");
if(it!=myMap.end()) {
   it->v1 = something;
   it->v2 = something;
}

【问题讨论】:

  • 您是否尝试迭代具有对值的写入权限的映射?
  • Go 中没有迭代器数据类型,您不应该尝试在 Go 中编写 C++,而是想一想您想要做什么并将 Go 的功能应用到手头的任务中.这就是为什么lazy1 的答案可能是正确的,但是你想要完成的事情并不完全清楚。

标签: map iterator go specifications


【解决方案1】:

在 go 中,使用 range 子句迭代地图非常容易。

myMap := map[string]int {"one":1, "two":2}

for key, value := range myMap {
  // Do something.
  fmt.Println(key, value)
}

可以打印

one 1
two 2

请注意,您在地图上以未定义的顺序进行迭代,因为它是由哈希表而不是树支持的。

go language spec 描述了 range 子句返回的内容,您可以查看 effective go 页面了解更多示例。

【讨论】:

  • 如果它回答了您的问题,请接受它:) (如果没有,请澄清,我会尽力提供帮助!)
【解决方案2】:

如果您只是想在地图中查找键,请使用以下命令:

package main

import (
    "fmt"
)

type Point struct {
    x, y int
}

func main() {
    points := make(map[string]*Point)

    p := &Point{1, 1}
    points["one"] = p

    if p1, found := points["one"]; found {
        p1.x = 100
    }

    fmt.Println(p)
}

【讨论】:

    【解决方案3】:

    例如,

    package main
    
    import "fmt"
    
    type MyStruct struct {
        v1 string
        v2 int
    }
    
    type MyMap map[string]MyStruct
    
    func main() {
        m := MyMap{
            "unum": MyStruct{"I", 1},
            "duo":  MyStruct{"II", 2},
        }
        fmt.Println("before:")
        for k, v := range m {
            fmt.Println(k, v)
        }
        var k string
        k = "unum"
        if v, ok := m[k]; ok {
            v.v1 = "one"
            v.v2 = 1
            m[k] = v
        }
        k = "tria"
        if v, ok := m[k]; ok {
            v.v1 = "III"
            v.v2 = 3
            m[k] = v
        }
        fmt.Println("after:")
        for k, v := range m {
            fmt.Println(k, v)
        }
    }
    

    输出:

    before:
    unum {I 1}
    duo {II 2}
    after:
    unum {one 1}
    duo {II 2}
    

    【讨论】:

    • 我知道这些代码可以工作。但我认为它比 c++ 慢。因为它有两次搜索算法。 golang 有像 c++ 一样的“参考数据类型”或“迭代器数据类型”吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2016-05-09
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    相关资源
    最近更新 更多