マップ


マップとは

Goの「マップ」とは、「キー」と「値」を組み合わせたデータ構造です。他の言語をかじったことのある人ならば、「連想配列」や「HashMap」という名称を聞いたことがあるのではないでしょうか。 値をマップに格納する場合、マップ内でユニークな値(キー)と、格納する値を関連づけます。また、マップから値を取得する倍は、キーを指定して値を取り出します。

マップの書式

宣言時の書式は、次の通りです。

map [キーの型] 値の型

マップのゼロ値は、nilになります。

マップの長さを取得

マップに格納されているキーと値の組み合わせの数は、配列と同様に「長さ」として取得します。

len(マップ型の変数)

マップの作成方法

マップは、スライスと同じく「参照型」でのみ値を持つため、大容量なデータを格納したマップをコピーしても、メモリを圧迫することはありません。 Go言語では、マップに限らず「参照型」の値を作成するには、「make」関数を使用します。書式は次の通り。

make(map[キーの型]値の型, キャパシティの初期値)
make(map[キーの型]値の型)// キャパシティの初期値は、省略も可能

make関数の第二引数には、マップに格納可能な要素数(キャパシティ)を指定しますが、これはあくまで初期値であり、必要に応じて自動で拡張されます。

マップの使用方法

マップを使用するには、配列と同様に角括弧とインデックスを使用します。インデックスにはキーを指定するため、整数以外も使用できます。 なお、既に使用されているキーと同じものを利用して値を格納すると、新しい値で上書きされます。また、未使用のキーを指定して値を取得すると、値の型のゼロ値が返ります。 マップの利用例は次の通り。

package main

import (
	"fmt"
)

func main() {
	// マップの作成
	currencies := make(map[string]string)

	// キーを指定して値を格納
	currencies["日本"] = "JPY"
	currencies["USA"] = "USD"
	currencies["EU"] = "EUR"
	currencies["中国"] = "CNY"

	// キーを指定して値を取得
	fmt.Println(currencies["日本"])
	fmt.Println(currencies["中国"])

	fmt.Println("==すべて取得=======")
	// for rangeを使用して、マップ内の値すべてを取得
	for country, currency := range currencies {
		// 1つめの戻り値にキー、2つめの戻り値に値が返ります
		fmt.Println(country, currency)
	}
	fmt.Println("==ここまで========")
}

実行結果は、次の通り。

JPY
CNY
==すべて取得=======
日本 JPY
USA USD
EU EUR
中国 CNY
==ここまで========

実行結果では、格納時の順序通りに取得できていますが、基本的に「range」を使用する際は、格納順序は保証されません。そのため格納順序に依存したコードは書かないようにしてください。

キーの存在確認

マップにキーが登録されているかどうかは、次の様にして確認します。

currency, exist := currencies["ロシア"]
// 2つめの戻り値が true の場合は、登録済み
if exist {
	fmt.Println("登録済み", currency)
else {
	fmt.Println("未登録")
}

キーの削除

マップから削除するには「delete」関数を使用します。

delete(マップ型の変数,キー)

キーの制約について

マップのキーに指定可能な型は、「==」と「!=」によって比較できるものである必要があります。そのため、キーには、「関数型」「マップ型」「スライス型」を指定すると、コンパイルエラーが発生します。 また、キーに「インタフェース型」を指定する場合は、コンパイルエラーは発生しませんが、実行時にキーの値を比較できなければランタイムパニックが発生します。

マップの初期化方法

マップを宣言と同時に初期化するには、次の様に指定します。

マップ型{キー:値, ... }

初期化の例は次の通り。

currencies := map[string]string{
	"日本": "JPY",
	"米国": "USD",
	"EU": "EUR",
	"中国": "CNY",
	}

最後の要素の次の行に } を指定する場合は、カンマが必須です。