Go 言語のマップ (map)

Go の map とは?

Go のマップ (map) はデータ構造の一つで、キーと値を保持するために使います。

一般的には「連想配列」「ディクショナリ」などとも呼ばれますが、Go では map という名前のデータ構造がビルトインのデータ構造として利用できます。

「マップ」というと「地図」の意味をイメージする人も多いかもしれませんが、ここでは「対応付け」という意味になります。

Go の map の基本的な使い方

Go では map 型の変数を次の形式で宣言します。

変数名 := map[キーのデータ型]値のデータ型{}

例えば、文字列 (string) をキーとして、数値 (float64) を値とする map を作成するには、次のように書きます。

m := map[string]float64{}

具体例は、次のようになります。

stocks := map[string]float64{}
stocks["MSFT"] = 245.71
stocks["AAPL"] = 123.74
stocks["GOOGL"] = 2347.58
fmt.Println(stocks["AAPL"]) // 123.74
fmt.Println(stocks["FB"])   // 0

宣言は := という表記を使わずに var 変数名 型名 を使って、次のように書くこともできます。

var stocks map[string]float64 = map[string]float64{}

が、このように書くことは、長ったらしいだけで、いいことはあまりないのでやめましょう。

上記のコードの6行目でわかるように、キーが設定されていない場合には値のデータ型の既定値が返ります (詳しくは後述)。

宣言と同時に初期化するには、次のように キー: 値 をカンマ , で区切って並べます。

stocks := map[string]float64{
	"MSFT":  245.71,
	"AAPL":  123.74,
	"GOOGL": 2347.58,
}

Go の map でキーの存在をチェックする方法

Go の map ではキーを設定していない値を参照した場合、エラーは発生せずに値のデータ型の既定値が返ります。

上の例で、 stocks["FB"] を参照した時に 0 が表示されていますが、これは float64 型の既定値が 0 だからです。

しかしこれでは、値が本当にゼロなのか、値を設定していないからゼロが返されてしまっているのか区別できません。

どのようにしたら、キーと値が設定されているのか判定できるでしょうか。

Go の map では次の形式で、キーが存在しているかどうかチェックできます。

値, キーの存在有無 := マップ変数[キー]

具体例は次のようになります。

stocks := map[string]float64{
	"MSFT":  245.71,
	"AAPL":  123.74,
	"GOOGL": 2347.58,
}

v, found := stocks["FB"]
if found { // found は false になるので...
	fmt.Println("Stock value is", v)
} else {
	fmt.Println("No data found") // こちらが実行される
}

Go の map でキーを削除する方法

Go の map で一度セットした、キー・値ペアを削除するには、ビルトイン関数の delete() が使えます。

delete() 関数に map と、削除したいキーを渡すとそのキーのエントリーが削除されます。

// "MSFT" を削除
delete(stocks, "MSFT")
fmt.Println(stocks) // map[AAPL:123.74 GOOGL:2347.58]

以上で、Go の map の使い方を説明しました。キー・バリューペアはよく使われる上に、自分で実装するのは面倒なので、こうしたデータ構造がビルトインで用意されているのはありがたいですね。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Go 言語入門