マップのすべてのキーを反復する


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言語仕様では、最初の値がキー、2番目の変数が値であること指定していますが、存在する必要はありません。


22
考えられる問題として、反復の順序が定義されていないことに注意してください。groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ
MNA

23
Sudhir:golang言語仕様では、マップが未定義のキーの順序を持​​つものとして明示的に定義されています。さらに、Go 1以降、キーの順序は実行間で意図的にランダム化され、認識された順序への依存を防ぎます。
Mark Renouf 2013

6
これは変更可能な反復ではないことに注意してください。つまり、キーを削除すると、反復を再開する必要があります。
リック・スミス

また、小さなデータセットの場合、マップの順序は予測可能です。
18年

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関数が文字列だけでなく、任意のタイプのキーを持つマップを取ることは可能ですか?
ロバートT.マクギボン2015

func Keys(m map[interface{}]interface{}) (keys []interface{})、@ RobertT.McGibbon関数「プロトタイプ」を変更する必要があります
a8m

1
@ArielM。それは正確なタイプに対してのみ機能しmap[interface{}]interface{}ます。Goはジェネリックをサポートしていません。map異なるキータイプのマップを受け入れるパラメータを持つ関数を作成することはできません。
icza

10

Go言語マップのすべてのキーのリストを取得する方法はありますか?

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

すべてのキーをどのように反復するのですか?

受け入れられた答えを使用してください:

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

1
for _, k := range v.MapKeys()あなたの例でkは、キーのスライスのintインデックスになるという意味だったと思います
ブライアンリーシュマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.