例えばC言語だと、iとjの2つの変数を操作しながらfor文を回すことができた。
# include <stdio.h>
int main(void) {
int i, j;
for (i = j = 0; i < 10 && j < 10; i++, j++) {
printf("%d, %d\n", i, j);
}
}
一方、Goのfor文は同じことができない。いくつか制限があるからだ。
- 連続代入ができない。
- assignment statementはstatementであって式ではない。
- forのセミコロンの前(InitStmt)と最後(PostStmt)に書けるのはSimpleStmtだけであり、複数の文を書けない。
というわけで、複数代入を工夫をするとここまでできるけど、
package main
import "fmt"
func main() {
for i, j := 0, 0; i < 10 && j < 10; i, j = i+1, j+1 {
fmt.Println(i, j)
}
}
この場合、i++
やj++
は使えなかった。
複雑なことがしたかったら、forの前やforの中に書けばよい、という思想なのかもね。
ちなみにif文だと条件式の手前に別の文を置けるけど、、、
if err := doSomething(); err != nil {
//...
}
実はこれはif文の特殊機能だった。あらゆる場所で使える機能ではない。
https://golang.org/ref/spec#If_statements