2011-09-03 46 views
3

如何編寫可以在C++中執行類似迭代器的Go代碼?Go是否有迭代器數據類型?

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

你們是不是要重複的進行中的值寫訪問的地圖嗎? –

+2

Go中沒有迭代器數據類型,您不應該嘗試*在Go *中編寫C++,而應該考慮您想要執行的操作並將Go的特性應用於當前的任務。這就是爲什麼lazy1的答案可能是正確的,但是你想完成的並不是完全明顯的。 – macbirdie

回答

0

例如,

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} 
+0

我知道這些代碼可以工作。但我認爲它比C++慢。因爲它有兩次搜索算法。 golang有像C++一樣的「refrence datatype」或「iterator datatype」嗎? – jinchao

8

在去,這是很容易迭代使用範圍子句的地圖。

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描述了範圍子句返回的內容,您可以看到effective go頁面以獲取更多示例。

+0

謝謝你的回答! – jinchao

+1

如果它回答你的問題,請接受它:)(如果沒有,請澄清,我會盡力幫助!) –

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