mapの概要
連想配列(ハッシュマップ) Goの予約語 | ||
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["次郎"]
で、キー「次郎」が存在するかどうかを確認できます。exists
がtrue
なら値を取得し、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つの戻り値を使う。