ここではGo言語のmapの基本について扱っていきます。
mapはキーと値ので構成されます。その値にキーでアクセスすることをができるので、辞書型のデータの操作に似ています。
mapの基本について見ていきましょう。
mapの宣言
mapの宣言をやって行きましょう。
mapは次のようにキーと値で構成します。
map[キーの型名]値の型名{キー: 値, キー: 値, ..., キー: 値}
mapキーワードに続けて角括弧[]でkeyの型名を指定し、続けてvalueの型名を指定。続けて波括弧{}にキーと値をコロンで対応させて定義して行きます。
具体的なコードを見て行きましょう。
package main
import "fmt"
func main() {
m := map[string]int{"リンゴ": 100, "イチゴ": 200, "オレンジ": 300}
fmt.Println(m)
}
keyにstring型、valueにint型を指定して、果物の名前と数字をセットにして定義して出力処理をしています。
実行すると次のように出力されます。
map[イチゴ:200 オレンジ:300 リンゴ:100]
辞書型のデータと似ていますが、mapと最初に表示されてキーと値が表示されるのも特徴です。
また、mapはデータの順番が保証されないことに注意が必要です。定義した順番と違って出力されているのがわかると思います。
mapの値にアクセス
mapは、キーを指定することで値にアクセスしてデータを操作することができます。これによって、データをすばやく検索することができるのが特徴となります。
キーの指定は角括弧[]に入れて行います。
先ほどのコードに追加する形で見てみましょう。
package main
import "fmt"
func main() {
m := map[string]int{"リンゴ": 100, "イチゴ": 200, "オレンジ": 300}
fmt.Println(m)
fmt.Println(m["リンゴ"])
m["イチゴ"] = 500
fmt.Println(m)
m["バナナ"] = 400
fmt.Println(m)
}
まず、「リンゴ」のキーを指定して、値を出力しています。
次は「イチゴ」のキーを指定して、値を変更しています。
最後は「バナナ」のキーを新しく指定して、値を新たに追加しています。
実行するとこうなります。
map[イチゴ:200 オレンジ:300 リンゴ:100]
100
map[イチゴ:500 オレンジ:300 リンゴ:100]
map[イチゴ:500 オレンジ:300 バナナ:400 リンゴ:100]
値を取り出し、値を変更し、値を追加という処理がされているのがわかります。
次のように、mapの値を定義せずにmakeを使って作成し、値を後から追加することもできます。
package main
import "fmt"
func main() {
m2 := make(map[string]int)
m2["マンゴー"] = 1000
fmt.Println(m2)
}
次のように値を定義していない(mapに無い)キーを指定するとどうなるかを見てみましょう。
package main
import "fmt"
func main() {
m := map[string]int{"リンゴ": 100, "イチゴ": 200, "オレンジ": 300}
fmt.Println(m)
fmt.Println(m["特に無し"])
v, isOk := m["リンゴ"]
fmt.Println(v, isOk)
v2, isOk2 := m["特に無し"]
fmt.Println(v2, isOk2)
}
mapに定義しなかったキー「特に無し」を指定して出力しています。
また、vとisOkという変数を使って、値とその存在について出力する処理を行っています。
実行結果は次のようになります。
map[イチゴ:200 オレンジ:300 リンゴ:100]
0
100 true
0 false
値の無いキーを指定すると「0」が出力されます。
値がある物については、値とtrueが、無いものには0とfalseが出力されているのがわかります。
Pythonコードで書くと…
Pythonにもmap関数というものはありますが、ちょっとここでのGoの使い方とは違う感じです。
ここではGoのmapのデータ構造に似た辞書型のコードでPythonのコードを書いてみます。
def main():
m = {"リンゴ": 100, "イチゴ": 200, "オレンジ": 300}
print(m)
print(m["リンゴ"])
m["イチゴ"] = 500
print(m)
m["バナナ"] = 400
print(m)
if __name__ == "__main__":
main()
Goでのコードと同じように、データを定義し、キーを指定して値を出力、キーを指定して値の変更、新しいキーを使って値の追加の処理を行っています。
結果は次のとおり。
{'リンゴ': 100, 'イチゴ': 200, 'オレンジ': 300}
100
{'リンゴ': 100, 'イチゴ': 500, 'オレンジ': 300}
{'リンゴ': 100, 'イチゴ': 500, 'オレンジ': 300, 'バナナ': 400}
辞書型のデータになっていること以外、結果は同じです。
ただし、Go言語のmapの時と違って、定義していないキーを指定するとエラーになります。
最後に
ここでは、Go言語のmapを使ったデータ構造の基本を見て来ました。
map[key]valueの形で、データ型を指定して定義します。辞書型のデータ構造に似ています。
キーを指定することで値の操作が出来ます。
mapのデータは順番は保証されませんが、キーを扱うことでデータを素早く検索することができるのが特徴です。