コンテンツにスキップ

Go/map

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Go

Goのプログラミング言語におけるmapキーワードは、連想配列(ハッシュマップ)を宣言・操作するために使用されます。以下にmapの全用途を網羅的に説明します。

1. mapの基本概念

[編集]

mapはキーと値のペアを格納するデータ構造です。各キーは一意であり、そのキーを使って対応する値にアクセスできます。

2. mapの宣言と初期化

[編集]

2.1 宣言のみ

[編集]
var m map[string]int
// この時点ではmはnil mapであり、使用前に初期化が必要

2.2 make関数による初期化

[編集]
m := make(map[string]int)
// または
var m map[string]int
m = make(map[string]int)

2.3 リテラルによる初期化

[編集]
m := map[string]int{
    "apple": 100,
    "banana": 200,
}

2.4 キャパシティ指定による初期化

[編集]
m := make(map[string]int, 100) // 初期キャパシティ100で初期化

3. mapの操作

[編集]

3.1 要素の追加・更新

[編集]
m["apple"] = 100 // 要素の追加
m["apple"] = 150 // 既存要素の更新

3.2 要素の取得

[編集]
value := m["apple"]

3.3 要素の存在確認

[編集]
value, exists := m["apple"]
if exists {
    // キーが存在する場合の処理
} else {
    // キーが存在しない場合の処理
}

3.4 要素の削除

[編集]
delete(m, "apple") // "apple"キーとその値を削除

3.5 要素数の取得

[編集]
size := len(m)

4. mapの反復処理

[編集]

4.1 rangeによる反復

[編集]
for key, value := range m {
    fmt.Println(key, value)
}

4.2 キーのみの反復

[編集]
for key := range m {
    fmt.Println(key)
}

4.3 値のみの反復

[編集]
for _, value := range m {
    fmt.Println(value)
}

5. mapの特殊な使い方

[編集]

5.1 mapのコピー

[編集]
dest := make(map[string]int)
for k, v := range src {
    dest[k] = v
}

5.2 mapをキーとするmap

[編集]
m := make(map[string]map[string]int)
m["fruits"] = map[string]int{
    "apple": 100,
    "banana": 200,
}

5.3 setの代用として使用

[編集]
set := make(map[string]bool)
set["apple"] = true // 要素の追加

// 存在確認
if set["apple"] {
    // 要素が存在する
}

// 要素の削除
delete(set, "apple")

5.4 空のmap値との比較

[編集]
var m1 map[string]int         // nil map
m2 := make(map[string]int)    // 空のmap(nilではない)

if m1 == nil {
    // trueになる
}
if m2 == nil {
    // falseになる
}

6. mapの制約と特性

[編集]

6.1 キーの制約

[編集]
  • キーとして使える型は、比較可能な型(==, != 演算子が使える型)のみ
  • 使用可能: 整数型、文字列型、ブール型、配列型、インターフェース型など
  • 使用不可: スライス型、マップ型、関数型(これらは比較不能)

6.2 値の型

[編集]
  • 値は任意の型が使用可能(スライス、別のマップ、構造体など)

6.3 その他の特性

[編集]
  • mapはリファレンス型(関数に渡すと参照渡しになる)
  • 順序が保証されない(反復処理の順序は実行ごとに異なる可能性がある)
  • スレッドセーフではない(並行アクセスには同期機構が必要)

7. 並行処理での利用

[編集]

7.1 sync.Mapによる並行処理対応

[編集]
var m sync.Map
m.Store("key", value)    // 要素の設定
value, ok := m.Load("key")    // 要素の取得
m.Delete("key")          // 要素の削除
m.Range(func(key, value interface{}) bool {
    // 要素の反復処理
    return true // 継続する場合はtrue
})

以上がGoのmapキーワードの主な用途と使い方です。mapはGoのプログラミングにおいて頻繁に使用される重要なデータ構造で、様々なユースケースで活用できます。