2021/11/21
はじめに
Golang を使いはじめて,for
+range
記法の便利さをつくづく感じていた.
しかし,どうも脳内での実行結果と実際の実行結果が異なっていた.
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]
配列の場合
配列に対するrange
はidx, value
を返すので,idx
を使い,配列から要素にアクセスするとのこと(疑似コードは割愛).
おわりに
また一つ賢くなりました.