ys memos

Blog

golangのrangeの注意点


golang

2021/11/21


Golang を使いはじめて,forrange記法の便利さをつくづく感じていた.

しかし,どうも脳内での実行結果と実際の実行結果が異なっていた.

Golang 自体に慣れていないため,脳内実行が誤っていると思い,じっくりコードを見たが,どうも想定のコードがかけている...

重い腰を上げデバッガを使ってみたところ,for _, _ := rangeの理解を間違っていたということに気づいた.


問題点の疑似コードが以下.

脳内では,rangeで受け取るものが参照だと思っており,内部でidを変更すると,humansが更新されると思っていた.

humans := map[string]int{"suzuki": 0, "sato": 1}
fmt.Println(humans)
for _, id := range humans {
  id++
}
fmt.Println(humans)
output
map[sato:1 suzuki:0]
map[sato:1 suzuki:0] <- 理想: sato:2 suzuki:1

mapのキーを受け取り,それを元に値を変更する.

humans := map[string]int{"suzuki": 0, "sato": 1}
fmt.Println(humans)
for name, id := range humans {
  humans[name] = id + 1
}
fmt.Println(humans)
output
map[sato:1 suzuki:0]
map[sato:2 suzuki:1]

配列に対するrangeidx, valueを返すので,idxを使い,配列から要素にアクセスするとのこと(疑似コードは割愛).


また一つ賢くなりました.


関連タグを探す