Go言語:map使用ノート

1614 ワード

余暇に、Go言語のコードを少し書いてみて、細部の問題が多いことに気づいて、忘れてください.
Goのmapはhash mapです.C++のmapはtree(主流の実装は赤黒樹)であり、C++のhash mapはunordered_mapである.
mapの定義と初期化
var m map[string]int
if m == nil {
    fmt.Println("Map m is nil.")
}

a := m["k0"]
fmt.Println(a)        //    0

m["k0"] = 123      // panic

mapは参照タイプなので、上記で定義したmの値はnilです.読み取り操作の場合、nil mapの動作はempty mapの動作と同様に「ゼロ値」を返します.書き込み操作ではnil mapがpanicします.
m := make(map[string]int)
if m != nil {
    fmt.Println("Map m is not nil.")
}

make関数を使用してmapを初期化できます.mはempty mapになります.
m := map[string]int{}
if m1 != nil {
    fmt.Println("Map m1 is not nil.")
}

もう1つのempty mapを定義して初期化する方法.
    m := map[string]int{
        "k1": 11,
        "k2": 22,
    }

mapを定義し、2つの値を挿入します.
mapの基本操作
i := m["k1"]
fmt.Println(i)

keyが存在し、対応するvalueを返します.keyが存在しない場合は「ゼロ値」を返します.
i, ok := m["k1"]

keyが存在する場合okはtrue、そうでない場合falseです.
k_vs := make(map[string][]string)        // k_vs means key-values
k_vs[kv.Key] = append(k_vs[kv.Key], kv.Value)

余分なコードでキーが存在するかどうかをチェックする必要はありません.キーが存在しない場合、k_vs[kv.Key]はnil slicesを返し、appendはnil slicesを自動的に作成します.
delete(m, "k1")

keyが存在する場合は削除します.keyが存在しなければ、何の役にも立たない.
len(m)

mapの長さを返します.
for k, v := range m {
    fmt.Println("Key:", k, "Value:", v)
}

1つのmapを遍歴すると,遍歴の順序は不確定である.