特定のキーを用いて値を取り出せる配列のことを連想配列と言います。いろいろな言語で箱の連想配列を使用できることがほとんどです。Golangでもmapを用いることで連想配列を実装することができます。今回はGolangのmapを用いて連想配列を使う方法について実装例とともに解説します。
mapを作成する
Golangでは参照方の変数をmake関数を使って作成します。make関数の使い方は以下のようになります。
var hoge := make(作成するmapの型 [,要素の数])
上のように作成するmapの型とオプションでmapに入る要素の数を指定します。ここでmapの型は以下のように表現します。
var object map[キーの型]要素の型
例えば文字列をキーとして文字列を参照できるmapは以下のように表現します。
var object map[string]string
したがってこのmapを作成するには以下のようになります。
object := make(map[string]string)
mapに要素を追加する
mapを作成したら要素を代入する必要がありますね、mapへのキーと要素の代入は以下のように行います。
object := make(map[string]string) object[キー] = 代入する要素
objectにいくつか要素を代入してみましょう。
var object := make(map[string]string) object["hoge"] = "ホゲホゲほーげ" object["fuga"] = "フガフガふーが" fmt.Println(object) // map[fuga:フガフガふーが hoge:ホゲホゲほーげ]
mapを生成するリテラルを使う
mapの作成と要素の代入をまとめてできるリテラルも存在します。
hoge := make[キーの型]要素の型{キー: 要素, キー: 要素, ..., キー: 要素} //...の部分はキーと要素の組
上のように{}でキーと要素を囲み、キーと要素をキー: 要素
の形式にすることでmapの作成と要素の代入をまとめてできます。
先ほど作成したmapをリテラルで作成すると以下のようになります。
object := map[string]string{"hoge": "ホゲホゲほーげ", "fuga": "フガフガふーが"} fmt.Println(object) // map[fuga:フガフガふーが hoge:ホゲホゲほーげ]
mapの要素を参照する
基本的な参照方法
mapに入っている要素をキーで取り出してみましょう。
hoge := make[キーの型]要素の型{キー: 要素, キー: 要素, ..., キー: 要素} elem := hoge[キー]
キーを[]でくくり参照することができます。先ほど作成したmapから要素を取り出してみましょう。
object := map[string]string{"hoge": "ホゲホゲほーげ", "fuga": "フガフガふーが"} hoge := object["hoge"] fuga := object["fuga"] wow := object["wow"] fmt.Println(hoge) // ホゲホゲほーげ fmt.Println(fuga) // フガフガふーが fmt.Println(wow) // 空文字
上のようにhogeとfugaにはキーに対応した要素が出力されます。またwowは存在しないキーですが、string型の初期値である""
(空文字)が入っています。
第二引数で要素の有無を取得する
さらにキーを用いた要素の参照では第二引数にキーに対する要素が代入されているかどうかをbool型で返すこともできます。
hoge := make[キーの型]要素の型{キー: 要素, キー: 要素, ..., キー: 要素} elem, ok := hoge[キー]
要素があればtrueが、なければfalseがokに代入されます。先ほどの例で確認してみましょう。
object := map[string]string{"hoge": "ホゲホゲほーげ", "fuga": "フガフガふーが"} _, hoge := object["hoge"] _, fuga := object["fuga"] _, wow := object["wow"] fmt.Println(hoge) // true fmt.Println(fuga) // true fmt.Println(wow) // false
要素があるhogeとfugaのキーに対してはtrue
が、要素のないwowに対してはfalse
が返っていることがわかります。
for文でrangeを用いたmapのループ
最後にmapの応用として、rangeを用いたfor文での活用方法について紹介します。範囲節のrangeを用いることでmapの要素全てに対して処理を行いたい場合に以下のような表現でそれを実現することができます。
for k, v := range hoge{ //処理 }
k | mapのキー |
v | mapのキーに対する要素 |
map | 繰り返しを行うmap型のデータ |
したがって先ほどの作成したhogeとfugaをキーにもつmapの全ての要素の最後に句点("。")をつけてみましょう。
object := map[string]string{"hoge": "ホゲホゲほーげ", "fuga": "フガフガふーが"} for k, v := range object{ object[k] = v + "。" } fmt.Println(object)// map[fuga:フガフガふーが。 hoge:ホゲホゲほーげ。]
ここでvは要素のエイリアスであるため、vに何かを代入しても実際のmapの要素を参照しているわけではないことに注意しましょう。上と同じ処理を以下のように記述することはできないということです。
object := map[string]string{"hoge": "ホゲホゲほーげ", "fuga": "フガフガふーが"} for _, v := range object{ v = v + "。" } fmt.Println(object)// map[fuga:フガフガふーが hoge:ホゲホゲほーげ]
この記事のまとめ
本記事ではGolangのmap型について解説をしました。最後に記事の要点をまとめておきます。
- Golangでは連想配列をmap型を用いて実装できる
- mapはmake関数を用いて作成する
- mapではキーで要素を参照する際に第二引数で要素の有無を取得できる
- rangeと組み合わせることでmapの前要素に対する処理がスマートに記述できる
皆さんもGolangでmapを使ってみましょう!