Go

Goのfor文で複数の変数を同時に回す

例えば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