いろいろ備忘録日記

主に .NET とか Go とか Python絡みのメモを公開しています。

Goメモ-24 (マップ, Maps, Tour of Go)

概要

Tour of Go の - Maps についてのサンプル。

tour.golang.org

Goは、最近の言語らしくマップ(ディクショナリともいう言語もあります)が標準装備です。

型の宣言の仕方がちょっと他の言語と比べると特殊で

map[キーの型]値の型

とします。例えばキーがintで値がstringの場合は

map[int]string

です。

Sliceの場合と同じで、生成する際は 組み込み関数 make() を使います。 生成と初期化を一発ですることも可能。

map1 := make(map[int]string)
map2 := map[int]string{
    100: "apple",
}

で、マップといえばどの言語でも大抵そうなのですが、存在しないキーに対してアクセスした場合に例外が発生したりします。

Goの場合も同じで、存在しないキーに対してアクセスすると panic します。キーが存在するかどうかチェックしながら値を取得するには以下のようにします。

if v, ok := map1[999]; ok {
    // キーが存在してる
}

要素を削除するには、組み込み関数 delete() を使います。

サンプル

package tutorial

import "fmt"

// Map は、 Tour of Go - Maps (https://tour.golang.org/moretypes/19) の サンプルです。
func Map() error {
    // ------------------------------------------------------------
    // Go言語のマップ
    // Go言語のマップは、他の言語のマップ/ディクショナリと同じもの.
    // Go言語のマップの型指定は、少し特殊で
    //   map[キーの型]値の型
    // という形で宣言する.
    //
    // マップのゼロ値は スライス と同様に nil
    // マップを生成する場合は、初期化リテラルを利用するか組み込み関数 make() を使う
    // キーが存在するかどうかの確認は、すこし特殊な判定の仕方を行う
    //   if v, ok := map1["not_exists"]; ok {
    //     // キーが存在する
    //   }
    // マップから要素を削除する場合は、組み込み関数 delete() を使用する
    //
    // ------------------------------------------------------------
    var (
        map1 map[int]string
    )

    // マップの初期値は nil
    fmt.Printf("%#v\n", map1)

    // マップを生成
    map1 = make(map[int]string)
    fmt.Printf("%#v\n", map1)

    // 値を設定
    map1[100] = "apple"
    fmt.Printf("%#v\n", map1)

    // 値を更新
    map1[100] = "banana"
    fmt.Printf("%#v\n", map1)

    // キーが存在するか確認
    if v, ok := map1[100]; ok {
        fmt.Println(v)
    }

    // 値の削除
    delete(map1, 100)
    fmt.Println(map1)

    // マップのリテラル表記
    var (
        map2 = map[int]string{
            100: "apple",
        }
    )

    fmt.Println(map2)

    return nil
}

try-golang/tutorial_gotour_17_map.go at master · devlights/try-golang · GitHub

実行すると以下な感じ。

[Name] "tutorial_gotour_map"
map[int]string(nil)
map[int]string{}
map[int]string{100:"apple"}
map[int]string{100:"banana"}
banana
map[]
map[100:apple]

過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com