57
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Goのfor rangeで思った値が取れなかった話

Posted at

GoでArrayやSliceの各要素に対して、何かしようとするときにfor rangeを使いますよね

例えばこんな感じ

words := []string{"hoge", "fuga", "foo", "bar"}

for word := range words {
	// do something
}

でも、これだとwordには、hogeやらfugaが入らず数値が入ってくる。

for word := range words {
	fmt.Println(word)
}
> go run main.go
0
1
2
3

なぜかと言うと、これwordにはインデックス値が入ってきているから。
要素の値を取りたければ、rangeの左辺に変数を2つ置けばOK

for _, word := range words {
	fmt.Println(word)
}
> go run main.go                                                                                                                  
hoge
fuga
foo
bar

冷静に考えれば当たり前のことなんですが、左辺に変数が1つだけでもコンパイル時にエラーにならないから、気付きづらい。他の言語で言うところのforeach感覚で書いてると良くやってしまう。

で、なぜこうなるかというと、rangeが返す2番目の値はオプショナルだから。

さらに言うと、1番目と2番目それぞれに入ってくる値がそれぞれ何なのかは、rangeの対象が何か?で変わってくるので要注意です。

詳しくはgithubのwiki、Range#Referenceを見ると良いと思います。

オプショナルだからとか言わず、いっそコンパイルで警告してくれたらなーとか、個人的には思ったりしたんですが、慣れの問題なんでしょうね。気をつけよう。

57
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
57
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?