【Go言語】マップ型の宣言・組み込み関数(make/delete/len)|初心者向け解説

目次

マップとは

Go言語のmapはキーと値のペアを持つデータ構造であり、他の言語でいう「辞書型(dictionary)」や「連想配列(associative array)」に相当します。

マップ型は次の形式のように、キーと値の間の対応関係を表現します。

map[{キーの型}]{値の型}

マップのゼロ値

Goのマップ型のゼロ値(デフォルト値)は nil です。

var myMap map[string]int
fmt.Println(myMap == nil) // true(ゼロ値はnil)

マップの宣言方法

varを使った宣言

var nilMap map[string]int   // 初期値nil

上記の場合nipMapは、以下のようなマップで初期値はnilとなります。

  • キー:string
  • 値:int

:=を使った宣言

:=を使用することで、省略した形で宣言できます。

x := map[string]int{}
マップ変数の初期化方法

空のマップリテラルを使用する場合と、nilマップを指定する場合は異なる意味を持ちます。

空のマップリテラルで初期化すると、そのマップに対して読み書きの両方が可能になります。

x := map[string]int{}   // 空のマップ
y := map[string]int   // nilマップ


// 空のマップに対する読み書き
fmt.Println(x["abc"])   // 0
x["abc"] = 3
fmt.Println(x["abc"])   // 3

// nilマップに対する読み書き
fmt.Println(y["abc"])   // 0
y["abc"] = 3   // ←パニックになる

上記の事象より、通常はnilでマップ変数を初期化することはないです。

また、空でないマップリテラルで初期化する場合は、「キー:値」の形式で記述します。

x := map[string][]string {
    "key1": []string{"value1", "value2"},
    "key2": []string{"value3", "value4"},
    "key3": []string{"value5", "value6"},
}

最後のデータの後にも「,」があることに注意してください。

makeを使った宣言

マップのサイズがある程度予想できる場合は、サイズを指定してmakeを呼び出します。

x := make(map[string]int, 10)

makeを使って生成されたマップの要素数(length)は0で、サイズは10になります。

マップの操作

マップの読み書き

マップmに関して、キーkに対応する値はm[k]で求められます。

x := map[string]int
x["key1"] = 1

カンマOKイディオム

カンマOKイディオムは、マップや型アサーションを扱う際にキーや型の存在を確認するための一般的なパターン です。

このイディオムを使うことで、「値が存在するかどうか」 を簡潔にチェックできます。

value, exists := myMap["key"]
  • value
    • マップから取得した値(キーがない場合は型のゼロ値)
  • exists
    • キーが存在する場合 true、存在しない場合 false

■具体例

x := map[string]int{
    "apple":  100,
    "banana": 200,
}

k, ok = x["apple"]
fmt.Println(k, ok)   // 100 true

k, ok = x["banana"]
fmt.Println(k, ok)   // 200 true

k, ok = x["lemon"]
fmt.Println(k, ok)   // 0 false

マップからの削除(delete)

組み込み関数のdeleteを使うことで、キーと値のペアをマップから削除できます。

x := map[string]int{
    "apple": 100,
    "banana": 200,
}

delete(x, "apple")
  • deleteの引数:
    • 第一引数:削除対象のマップ(ここでは x
    • 第二引数:削除対象のキー(ここではapple

マップのキー数(len)

len() 関数を使うと、マップに登録されているキーの数を取得できます。

x := map[string]int{
    "apple": 100,
    "banana": 200,
}

num := len(x)   // 2
  • lenの引数:
    • 第一引数:対象のマップ(ここでは x

マップの注意点

マップ同士での比較はできない

2つのマップが同じか否かを判定するのに、==!=を使用するとコンパイル時にエラーが発生します。

マップと比較できるのはnilだけなので、注意が必要です。

x := map[string]int   // xはnilに初期化される
fmt.Println(x == nil)   // true
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次