format_list_bulleted
【Golang】 Golangのmapを使った連想配列の書き方、使い方について解説
最終更新日時:2020-05-12 12:00:06



特定のキーを用いて値を取り出せる配列のことを連想配列と言います。いろいろな言語で箱の連想配列を使用できることがほとんどです。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{
  //処理
}
kmapのキー
vmapのキーに対する要素
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を使ってみましょう!