Go言語のマップ(map)の基本!定義・初期化・要素追加方法
生徒
「先生、Go言語で『マップ』って何ですか?聞いたことがない用語で難しそうです…」
先生
「マップは簡単に言うと『鍵と値をセットで管理する箱』のようなものです。例えば、住所録や辞書のイメージですね。」
生徒
「鍵と値ですか?どういうことですか?」
先生
「鍵(key)を使って値(value)を取り出せるデータの集まりです。住所録なら名前が鍵、住所が値になります。Go言語のマップはそれを簡単に扱えるデータ構造です。」
生徒
「なるほど!具体的にどうやって作って使うんですか?」
先生
「では、基本の定義・初期化と要素の追加方法を一緒に見ていきましょう!」
1. マップ(map)とは?
Go言語のマップは、ひとことで言うと「名前で探せる引き出し」のような仕組みです。同じ箱にたくさんのデータを入れるのではなく、ひとつずつに名前(キー)を付けておくことで、あとから必要な情報だけをすぐ取り出せます。たとえば、友だちの電話帳なら「名前」がキー、「電話番号」が値になります。キーを指定すれば対応する値が返ってくるので、どれだけデータが増えても効率よく管理できます。
キーと値の組み合わせは、文字列・数値のような単純な情報だけでなく、ほかの型や構造体など少し複雑なデータにも使えます。最低限の書き方を覚えてしまえば、商品の在庫や社員情報など、実務的なプログラムでも活躍します。
// 簡単なマップの例
words := map[string]string{
"apple": "りんご",
"banana": "バナナ",
}
// 「apple」を指定すると「りんご」が取り出せる
fmt.Println(words["apple"])
このように、マップは「名前で情報をすばやく取り出す」ための基本機能です。まずは仕組みを短いサンプルで見ることで、全体のイメージがつかみやすくなります。
2. マップの定義と初期化の基本
マップを使うには、まず「どんなキーと値を使うか」を決めて、マップを作ります。Go言語では次のように書きます。
var myMap map[string]int
これは「キーが文字列(string)、値が整数(int)のマップを作るよ」という意味です。ただ、このままだとまだ中身はありません。使う前に初期化が必要です。
初期化は次のように書きます。
myMap = make(map[string]int)
このmake関数は「新しいマップを用意する」命令です。こうすると空のマップが作られて、値を追加できるようになります。
3. マップを一行で作る方法
マップは定義と初期化を一行で書くこともできます。例えば:
myMap := make(map[string]int)
この書き方で、すぐに使えるマップを用意できます。
4. マップへの要素追加方法
マップに値を追加したいときは、キーを指定して値を代入します。例えば:
myMap["apple"] = 100
myMap["banana"] = 200
ここでは、「apple」というキーに100を、「banana」というキーに200を割り当てています。あとでキーを指定して値を取り出せます。
5. マップの値を取り出す方法
マップから値を取得するには、キーを指定します。例えば:
price := myMap["apple"]
fmt.Println(price) // 100 と表示される
もし指定したキーがマップにない場合は、その型のゼロ値が返ります。整数なら0、文字列なら空文字("")です。
6. マップのキーの存在確認
キーがマップにあるかどうか調べたい場合は、次のように書きます。
price, ok := myMap["orange"]
if ok {
fmt.Println("値は", price)
} else {
fmt.Println("キーは存在しません")
}
ここでokはキーが存在すればtrue、なければfalseになります。
7. マップの初期値を指定して作る方法
マップを作るときに、最初からいくつかの値を入れておきたい場合は、次のように書けます。
myMap := map[string]int{
"apple": 100,
"banana": 200,
}
この方法なら、すぐに値を使えます。
8. マップの使いどころのイメージ
マップは「名前と電話番号」「商品名と値段」「社員番号と社員情報」など、何かを「キー」で指定して「値」を取り出したいときに役立ちます。
たとえば、お店のレジシステムで「商品名から値段を調べる」場合、マップを使うと簡単にできます。
9. 注意点:マップは順序を保証しない
マップはキーと値のセットですが、データを追加した順番で取り出せるとは限りません。順番が必要な場合は、別の方法を使う必要があります。
10. マップの要素削除方法
マップから要素を削除したいときは、delete関数を使います。
delete(myMap, "apple") // "apple"というキーの要素を削除
削除した後、そのキーは存在しなくなります。
まとめ
ここまで、Go言語のマップについて丁寧に学んできました。マップはひとことで言うと「名前で値を管理できる箱」のような仕組みで、プログラムの中で情報を効率よく扱うためにとても便利な存在です。ふつうの配列やスライスでは番号で情報を探しますが、マップなら「名前」や「商品名」など、覚えやすい文字列を使って値を取り出せます。この考え方は日常の感覚に近く、初心者でも感覚的に理解しやすい特徴があります。特に、商品名と価格、ユーザー名と住所、社員番号と社員情報など、何かを検索して値を得たい場面ではとても強力です。
マップでは、まず「型」を決めることから始まります。キーが文字列ならstring、値が整数ならintと決めて定義します。定義しただけではまだ使えないので、make関数で初期化してマップの箱を準備します。この流れはとても大切で、ふだんのプログラミングでもよく登場する書き方です。また、定義と初期化を一行で書ける省略記法もあり、素早くマップを使いたい場合に役立ちます。短いコードで明確に意図を表せる書き方は、初心者だけでなく経験者にとっても読みやすい形です。
マップへの値の追加は、キーを指定して値を代入するだけです。これは感覚的に理解しやすく、日常会話に近い形で表現できます。「リンゴの値段は〇〇円」「商品Aは〇〇」といったイメージで、プログラムにも自然な書き方になります。そして、すでに存在するキーに新しい値を入れると上書きになります。特別な記号を使う必要はなく、単純に代入するだけなので混乱しづらいのもメリットです。
値を取り出す方法は、マップ[キー]の形で書きます。配列と似ていますが、番号ではなく名前で検索する点が大きな違いです。初心者にとって、この書き方はとても分かりやすく、実際のプログラムでもよく使われます。また、キーが存在しない場合には、対応する型のゼロ値が返ります。整数なら0、文字列なら空文字、真偽値ならfalseです。この「エラーにならずにゼロ値が返る」動作は便利ですが、意図せず値が空になっているように見えてしまう場面もあるため、存在確認と組み合わせるとより安全に扱えます。
存在確認は、値と同時にokという変数を受け取ることで実現できます。これは、プログラムが思い通りに動いているかをはっきり判断できる方法で、実務でもよく使われる書き方です。たとえば、会員情報を探すときに「その人が登録されているか」を知りたい場面で役立ちます。見つかった場合と見つからない場合で処理を分けられるため、誤った動作や想定外の不具合を防ぎやすくなります。
さらに、最初から値を入れた状態でマップを作る方法も学びました。設定ファイル、初期データ、テスト用データなど、あらかじめ準備しておきたいデータをまとめて表現できます。コードが短くなるだけでなく、読み手にも意図がはっきり伝わります。「このマップには最初からこの値が入っています」と明確に記述できるため、後から確認する人にも優しい書き方です。プログラムを読みやすく、修正しやすくすることは、実務でとても大切です。
マップは便利ですが、ひとつだけ注意点がありました。それは、追加した順番がそのまま保たれるとは限らないことです。マップは内部で検索しやすいようにデータを管理するため、表示するたびに順番が変わることがあります。順番に意味がある場合は、別の仕組みを使ったりソートしたりする必要があります。ただ、検索や管理が目的であれば問題にならず、多くの場面で役立ちます。「名前で値を取り出す」ための仕組みとして、マップは非常に優れています。
そして最後に、マップから要素を削除する方法としてdelete関数を学びました。不要なデータを片付けたり、間違って登録した値を消したりするときに使えます。削除したあとは、そのキーは存在しなくなるため、取り出してもゼロ値になります。削除前後で状態を比べたいときは、存在確認と組み合わせると安全です。システム開発では、データを追加するだけでなく、きちんと削除して整理することも大切なので、覚えておくと役に立ちます。
簡単なサンプルで振り返り
package main
import "fmt"
func main() {
prices := map[string]int{
"apple": 120,
"banana": 200,
"milk": 150,
}
fmt.Println(prices["apple"])
prices["apple"] = 130
price, ok := prices["orange"]
if ok {
fmt.Println(price)
} else {
fmt.Println("見つかりません")
}
delete(prices, "banana")
fmt.Println(prices["banana"])
}
この短いサンプルだけでも、マップの定義、初期値、上書き、存在確認、削除までの流れがすべて体験できます。初心者でも、ひとつずつ動作を追いながら実行すれば、マップの働きが直感的に理解できるはずです。身近なデータをマップで表現すると、プログラムの考え方がぐっと分かりやすくなります。名前と情報を結びつける仕組みは、日常でもよく使う考え方です。電話帳、商品データ、会員名簿、成績表など、あらゆる場面で活用できるため、実務にも応用しやすい知識になります。
生徒
「マップって、ふつうの配列より使いやすい場面が多いんですね。名前で値を取り出せるのが、こんなに便利だとは思いませんでした。」
先生
「そうなんです。配列は番号でアクセスしますが、マップは名前で検索できます。たとえば『商品名から値段を取り出す』など、実際のアプリやシステムに近い書き方ができます。」
生徒
「削除するときにdeleteを使うのも分かりやすかったです。存在確認の書き方も便利ですね。」
先生
「存在確認は特に大切です。実務では、データがあるかどうかで処理を変えることが多いので、安心して使える書き方になります。」
生徒
「マップって難しいのかと思っていましたが、やってみるとシンプルで使いやすいですね。」
先生
「その通りです。実際に手を動かして試していくと、もっと理解が深まりますよ。ぜひ、身近なデータでマップを作ってみてください。」