マップ(map)は、他の言語では連想配列とか辞書とか言われているものです。
マップはキーと値とを関連付けます。
イテレーション可能な構造のコンテナですが、マップには順序がありません。毎回違った出力になるかもしれません。
イテレーションとは、for文などで繰り返して次の要素にアクセスできることです。
マップはインデックス(配列の添字)で値を取得することはできず、かならずキーを使うことになります。
マップはスライスと同じ参照型の一種です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
package main import ( "fmt" ) func main() { //文字列がキーで文字列が値の空のマップ作成方法1 m1 := map[string]string{} //intがキーで文字列が値の空のマップ作成方法2 m2 := make(map[int]string) fmt.Println(m1) //map[] fmt.Println(m2) //map[] //適当なキーに適当な値を入れる m1["k1"] = "abc" m2[1] = "あいうえお" m2[2] = "かきくけこ" fmt.Println(m1) //map[k1:abc] fmt.Println(m2) //map[1:あいうえお 2:かきくけこ] //削除する delete(m2, 1) fmt.Println(m2) //map[2:かきくけこ] //キーに対する要素が存在するかどうかは、2つの目の値(bool型のtrueかfalse)で確認します。 _, ok := m2[1] fmt.Println(ok) //false v, ok := m2[2] fmt.Println(v) //かきくけこ fmt.Println(ok) //true //マップ作成と同時に代入 m3 := map[string]int{"foo": 1, "bar": 2} fmt.Println(m3) //map[foo:1 bar:2] fmt.Println(m3["foo"]) //1 //改行して書く場合、最終行にもカンマが必要です m4 := map[string]int{ "foo": 1, "bar": 2, "baz": 3, } fmt.Println(m4) //map[bar:2 baz:3 foo:1] //for文で繰り返し処理(順番は実行ごとにかわる可能性があります) for k, v := range m4 { fmt.Println(k) fmt.Println(v) } //マップは参照 m5 := m4 fmt.Println(m5) //map[foo:1 bar:2 baz:3] m5["foo"] = 5 fmt.Println(m5) //map[foo:5 bar:2 baz:3] fmt.Println(m4) //map[foo:5 bar:2 baz:3] } |
よく使う方法
マップのキーは重複しないので、すでにあるキーに値を代入すると上書きします。その性質を利用してアンケートなどのデータを集計できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
package main import ( "fmt" ) func main() { //何らかの重複データがあるスライス s := []string{ "乃木坂46", "Perfume", "Perfume", "Perfume", "ももいろクローバーZ", "乃木坂46", "ももいろクローバーZ", "ももいろクローバーZ", "乃木坂46", "乃木坂46", "ももいろクローバーZ", "Perfume", "Perfume", "Perfume", "乃木坂46", "Perfume", "Perfume", } //マップを使ってカウント m := map[string]int{} for _, v := range s { _, ok := m[v] if ok { m[v] += 1 } else { m[v] = 1 } } fmt.Println(m) //map[乃木坂46:5 Perfume:8 ももいろクローバーZ:4] } |
マップの値で降順ソートすると見やすくなりますが、そのやり方は、Go言語では、構造体を作ったり、メソッドを作ったりと難易度が高いので、後日にしたいと思います。