【Golang】map(連想配列)の作り方と使い方をわかりやすく解説

Golangでmap(連想配列)の作り方

まず、前提としてGolangでは連想配列のことをmapと言うので、以後は連想配列のことをmapとだけ記します。

【明示的にmap型を定義する場合】

var 変数名 map[keyの型]valueの型 = map[keyの型]valueの型{key: value}

【暗黙的にmap型を定義する場合】

変数名 := map[keyの型]valueの型{key: value}

map(連想配列)の使い方

mapを定義(作成)する

keyが文字列、valueが数値であるmapを作成し、出力してみます。

package main

import (
  "fmt"
)

func main() {
  var fruitsPrice map[string]int = map[string]int{"orange": 40, "apple": 60, "banana": 10}

  fmt.Println(fruitsPrice)
}

実行結果

map[apple:60 banana:10 orange:40]

出力される際はkeyがアルファベット順で表示されます。

mapの中身を取り出す

map内の要素(value)を取り出したい時は

変数[key]

の形式で書けば取得できます。

map内のvalueを1つずつ取り出して出力してみます。

package main

import (
  "fmt"
)

func main() {
  var fruitsPrice map[string]int = map[string]int{"orange": 40, "apple": 60, "banana": 10}

  fmt.Println(fruitsPrice["orange"])
  fmt.Println(fruitsPrice["apple"])
  fmt.Println(fruitsPrice["banana"])
}

実行結果は以下の通り

40
60
10

keyが存在する時・しない時の挙動

Golangのmapに対してkeyを指定すると、そのkeyに対するvalueが取得できるだけでなく、2つ目の返り値にはkeyが存在しているかしてないかがboolean値で返ってきます。

【map内に指定したkeyが存在する場合】

var fruitsPrice map[string]int = map[string]int{"orange": 40, "apple": 60, "banana": 10}
price, isPresent := fruitsPrice["orange"]

fmt.Println(price)  // 40
fmt.Println(isPresent)  // true

【map内に指定したkeyが存在しない場合】

var fruitsPrice map[string]int = map[string]int{"orange": 40, "apple": 60, "banana": 10}
price, isPresent := fruitsPrice["grape"]

fmt.Println(price)  // 0
fmt.Println(isPresent)  // false

keyが存在しない場合は、エラーを出力してその時点でプログラムを終了させる処理にすると、以下のようになります。

package main

import (
  "fmt"
  "log"
)

func main() {
  var fruitsPrice map[string]int = map[string]int{"orange": 40, "apple": 60, "banana": 10}

  price1, isPresent := fruitsPrice["apple"]
  if !isPresent {
    log.Fatalln("[ERROR]: みかんが存在しません")
  }
  fmt.Println(price1)

  price2, isPresent := fruitsPrice["grape"]
  if !isPresent {
    log.Fatalln("[ERROR]: ぶどうが存在しません")  // ここでプログラミムが止まるはず
  }
  fmt.Println(price2)

  price3, isPresent := fruitsPrice["apple"]
  if !isPresent {
    log.Fatalln("[ERROR]: りんごが存在しません")
  }
  fmt.Println(price3)

  price4, isPresent := fruitsPrice["banana"]
  if !isPresent {
    log.Fatalln("[ERROR]: バナナが存在しません")
  }
  fmt.Println(price4)
}

出力結果

60
2021/11/21 21:06:10 [ERROR]: ぶどうが存在しません
exit status 1

fruitsPrice[“grape”]が存在しないため、直後のif文の中身が実行され、その時点でプログラムが終了してますね。

タイトルとURLをコピーしました