2011-09-03 4 views
3

C++에서 map iterator와 같은 작업을 수행 할 수있는 Go 코드를 작성하려면 어떻게해야합니까? 예를 들어Go에는 iterator 데이터 유형이 있습니까?

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에는 iterator 데이터 유형이 없으므로 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 데이터 유형"또는 "iterator 데이터 유형"을 가지고 있습니까? – 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) 
} 
관련 문제