지도의 모든 키를 반복


316

Go 언어 맵에서 모든 키 목록을 얻는 방법이 있습니까? 요소 수는에 의해 제공 len()되지만 다음과 같은 맵이있는 경우 :

m := map[string]string{ "key1":"val1", "key2":"val2" };

모든 키를 어떻게 반복합니까?

답변:


546

https://play.golang.org/p/JGZ7mN0-U-

for k, v := range m { 
    fmt.Printf("key[%s] value[%s]\n", k, v)
}

또는

for k := range m {
    fmt.Printf("key[%s] value[%s]\n", k, m[k])
}

for명령문의 go language specs 는 첫 번째 값이 키이고 두 번째 변수는 값이지만 지정하지 않아도되도록 지정합니다.


22
가능한 한, 반복 순서는 정의되어 있지 않습니다. groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ
mna

23
Sudhir : golang 언어 사양은지도를 정의되지 않은 키 순서로 명시 적으로 정의합니다. 또한 Go 1 이후로 키 순서는 의도 된 순서에 대한 종속성을 방지하기 위해 실행간에 의도적으로 임의 화됩니다.
Mark Renouf

6
이것은 변경 가능한 반복이 아니므로 키를 삭제하면 반복을 다시 시작해야합니다.
Rick Smith

작은 데이터 세트의 경우 맵 순서를 예측할 수 있습니다.
woot

14

다음 slice은 맵 키 를 얻는 쉬운 방법 입니다.

// Return keys of the given map
func Keys(m map[string]interface{}) (keys []string) {
    for k := range m {
        keys = append(keys, k)
    }
    return keys
}

// use `Keys` func
func main() {
    m := map[string]interface{}{
        "foo": 1,
        "bar": true,
        "baz": "baz",
    }
    fmt.Println(Keys(m)) // [foo bar baz]
}

그것은 가능합니다 Keys기능, 모든 유형의 키가 아닌 문자열을지도를 취할?
Robert T. McGibbon

func Keys(m map[interface{}]interface{}) (keys []interface{}), @ RobertT.McGibbon 함수 "prototype"을 변경해야합니다
a8m

1
@ArielM. 그것은 정확한 유형에 대해서만 작동합니다 map[interface{}]interface{}. Go는 제네릭을 지원하지 않습니다. map다른 키 유형의 맵을 허용 하는 매개 변수를 사용하여 함수를 작성할 수 없습니다 .
icza 2016

10

Go 언어 맵에서 모든 키 목록을 얻는 방법이 있습니까?

ks := reflect.ValueOf(m).MapKeys()

모든 키를 어떻게 반복합니까?

허용 된 답변을 사용하십시오.

for k, _ := range m { ... }

1
나는 for _, k := range v.MapKeys()당신의 예에서 k열쇠 조각의 int 색인이 될 것이라고 생각했다고 생각합니다.
Brian Leishman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.