Go言語のmapでマップ(連想配列)を使う方法をわかりやすく解説

スポンサーリンク
スポンサーリンク

mapの概要

連想配列(ハッシュマップ) Goの予約語

map

概要mapは、キーと値のペアを持つデータ構造で、他の言語のハッシュマップや辞書型と同じような役割を持ちます。

  • mapはキーと値のペアでデータを管理する。
  • キーの型は一意性を持ち、値に対応するデータを格納する。
  • 動的に要素を追加・削除できる。

基本的なmapの使い方

以下のコードは、mapを使ってキーと値を関連付ける基本的な例です。

package main

import "fmt"

func main() {
    // mapの定義
    ages := map[string]int{
        "太郎": 25,
        "花子": 30,
        "次郎": 20,
    }

    fmt.Println("太郎の年齢:", ages["太郎"])
}

解説:

  • map[string]intは、キーがstring型で、値がint型のマップを定義します。
  • ages["太郎"]で「太郎」の年齢(25)を取得します。

実行結果:

太郎の年齢: 25

要素の追加・削除

mapには新しい要素を追加したり、既存の要素を削除することができます。

package main

import "fmt"

func main() {
    ages := make(map[string]int) // 空のmapを作成

    // 要素の追加
    ages["太郎"] = 25
    ages["花子"] = 30

    fmt.Println("追加後:", ages)

    // 要素の削除
    delete(ages, "太郎")

    fmt.Println("削除後:", ages)
}

解説:

  • make(map[string]int)を使って空のマップを作成します。
  • ages["太郎"] = 25のようにして新しい要素を追加します。
  • delete(ages, "太郎")で「太郎」のデータを削除します。

実行結果:

追加後: map[太郎:25 花子:30]
削除後: map[花子:30]

要素の存在確認

キーがマップ内に存在するかどうかを確認するには、2つの戻り値を受け取ります。

package main

import "fmt"

func main() {
    ages := map[string]int{"太郎": 25, "花子": 30}

    age, exists := ages["次郎"]
    if exists {
        fmt.Println("次郎の年齢:", age)
    } else {
        fmt.Println("次郎のデータは存在しません")
    }
}

解説:

  • age, exists := ages["次郎"]で、キー「次郎」が存在するかどうかを確認できます。
  • existstrueなら値を取得し、falseならデータが存在しないことを示します。

実行結果:

次郎のデータは存在しません

マップのループ処理

for rangeを使うと、マップの全要素を走査できます。

package main

import "fmt"

func main() {
    ages := map[string]int{"太郎": 25, "花子": 30, "次郎": 20}

    for name, age := range ages {
        fmt.Println(name, "の年齢:", age)
    }
}

解説:

  • for name, age := range agesで、マップのキーと値を順番に取得できます。
  • マップの走査順序は保証されません(実行ごとに異なる順番で出力される可能性があります)。

実行結果(順序はランダム):

太郎 の年齢: 25
花子 の年齢: 30
次郎 の年齢: 20

注意事項

  • マップの順序は保証されない: for rangeでループすると、要素の順序はランダム。
  • マップのキーは一意である: 同じキーを設定すると、値が上書きされる。
  • マップのゼロ値はnil: 宣言のみした場合、nilのため使う前にmakeで初期化する。

よくある質問

Q: マップのサイズを事前に設定できますか?
A: いいえ。Goのマップはサイズを動的に拡張するため、固定サイズで作成することはできません。
Q: マップの要素を安全に削除する方法は?
A: delete(map, key)を使えば安全に削除できます。存在しないキーを削除してもエラーにはなりません。
Q: マップの要素数を取得する方法は?
A: len(map)を使うと、現在のマップの要素数を取得できます。
Q: マップのキーの型に使えないものは?
A: スライスやマップ自体はキーとして使えません(比較できない型)。基本型(整数、文字列、構造体など)はキーとして使用可能です。

まとめ

  • mapはキーと値のペアを管理するデータ構造。
  • 要素の追加・取得・削除が容易にできる。
  • マップのループ処理では順序が保証されない。
  • キーの存在を確認するには2つの戻り値を使う。