Go言語 ~基礎編~ Maps

go
KOUKI
KOUKI

Mapについて学んでいきましょう。

Go言語のデータ構造として、これまでにArrayとSliceについて学んできました。

しかし、Go言語にはその他にもMapと呼ばれる重要なデータ構造があります。

本項では、Mapを学んでいきましょう。

学習記事まとめ

Mapとは

Go言語には、ArrayやSliceの他に「Map」と呼ばれるデータ構造体が存在します。

Mapは、Key-Value型のコレクションで、Valueにアクセスする時は、Keyを使います。また、ArrayやSliceはindexに数値しか使えないのに対し、Mapではどのようなデータ型も使えます。

以下、Mapの宣言方法です。

また、Sliceと同様にmake関数で、Mapの実態を作成できます。

または、Sliceと同様にshort variable declarationも使えます。

実際にコードで確認してみましょう。

このサンプルコードを実行してみます。

Mapリテラル

Mapは、変数宣言と同時に初期値を格納可能です。

指定したKeyが存在しない場合

指定したKeyがMapに存在しない場合、どのような挙動を取るのでしょうか?

KOUKI
KOUKI

サンプルコードを書いて、ガンガン実証してみましょう!

実行します。

Keyがない場合はエラーにならず、「0」が取得されるようですね。

ちなみに「0」になったのは、MapのValueTypeがint型だったためです。

KOUKI
KOUKI

Go言語のtypeの初期値が出力されるようですね。

実行してみます。

Mapの注意点

Sliceと同様にMapも初期化されていない場合は、nilになります。そして、宣言されているだけのMapに値を格納するとエラーが発生します。

実証してみましょう。

KOUKI
KOUKI

パニックが起こりましたね。KeyやValueを追加する前には必ずmakeかリテラルを使いましょう。

変数「ok」

Mapの第二引数には、bool値を返すようになっています。この値を受け取る際、Goの開発者は変数に「ok」と名付けるそうです(明確な名前かつ短いため)。

Map削除

次は、Mapの値を削除する方法について見ていきましょう。

Go言語では、delete関数を提供しており、 この関数がその役割を担います。

簡単ですね。

やってみよう1

プログラミング学習は、アプトプットが大切です。

次のアプリケーションを作成してみましょう。

仕様
1. names.txtを読み取る
2. names.txtに書き込まれた名前をカウントする
3. カウントの結果をterminal上に出力する
4. Mapを利用する

端的に言うと、ファイルの中に同名の名前がいくつ記載されているのか調べるプログラムです。

names.txtの中身は、こんな感じです。

それでは、早速作りましょう。サンプルプログラムを載せておきます。

実行してみましょう。

Mapのループ

ArrayやSliceと同様に、Mapもfor…rangeが使えます。

サンプルはこちらです。

簡単ですね。ちなみに、Mapは、Keyの順番が保証されていないコレクションになります。何回かプログラムを実行してみましょう。

KOUKI
KOUKI

これが結構バグになりやすいです。気をつけてください。

sortパッケージのStrings関数を使うとソートができます。

まとめ

KOUKI
KOUKI

最後にこの章で学んだことをまとめておきましょう。

まとめ
・ mapキーワードで、Mapを宣言する -> var myMap map[string]int
・ makeキーワードで、Mapを作成する -> myMap = make(map[string]int)
・ mapは、key-valueタイプのデータ構造隊 -> myMap[“key”] = value
・ mapの値はkeyでアクセスする -> fmt.Println(myMap[“key”])
・ Mapリテラルで、作成&初期化ができる -> map[string]int{“a”: 1, “b”: 2}
・ Map内に存在しない要素へアクセスした場合は、基底になったtypeの初期値を返す
・ Mapの2番目の戻り値はbool値であり、ok変数で受け取るとGood
・ Mapの要素を削除したい場合は、delete関数を使用する
・ for…rangeでMapの要素を一気に出力することができる

次回

次回は、Sliceについて学んでいきます。

参考書籍

コメントを残す