Есть ли в Go тип итератора? - PullRequest
       28

Есть ли в Go тип итератора?

3 голосов
/ 03 сентября 2011

Как мне написать код Go, который может делать что-то вроде итератора карты в C ++?

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

Ответы [ 3 ]

8 голосов
/ 03 сентября 2011

На ходу довольно легко перебирать карту, используя предложение 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 описывает то, что возвращает предложение range, и вы можете увидеть страницу ffective go для других примеров.

2 голосов
/ 13 сентября 2011

Если вы просто пытаетесь найти ключ на карте, используйте следующее:

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)
}
0 голосов
/ 03 сентября 2011

Например,

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}
...