Go のセミコロンの扱いが変わった。

09/12/22にリリースされたバージョンで、セミコロンの扱いが変わった。

今までは、セミコロンは、ブロックの末尾と、括弧の後だけ省略OKだったんだけど、
それが、セミコロンなしでもOKになった。*1

大元は、golang-nutsに投稿された以下の提案みたい。
http://groups.google.com/group/golang-nuts/browse_thread/thread/5ee32b588d10f2e9

セミコロン打たなくていいのは、かなりいい感じ。
スムースにかける。
コーディングが早くなる感じがする。

けど、上記のURLでも指摘されているけど、複数行に渡る式で演算子を前置するフォーマットがエラーになるのが、あぅー。

  // この書き方はeエラー
  foo := f1()
       + f2()
       + f3()
  
 // こう書くのが正解
 foo := f1() +
         f2() +
         f3()

演算子が前置の方が、自分は見やすいと思っているで、ちょっとなーという感じ。

セミコロンがないから、上の書き方がエラーになるのかと思いきや、セミコロンをつけても、エラー。
なので、以前のバージョンで書いたコードで、前置の演算子があるやつは軒並みコンパイルエラーになる。

そういう人の為に(だと思うけど)、gofmt を -oldparsers オプションを指定して、昔のコードを通すと、セミコロンなしのコードに変換してくれる。
例えば、以下の以前のコンパイラだと問題ないコードを

package main
import "fmt"
func f1() int { return 1 }
func f2() int { return 1 }
func f3() int { return 1 }
func main() {
  foo := f1()
       + f2()
       + f3();
  fmt.Println(foo)
}

gofmt -oldparser を通すと、ご丁寧に、演算子を後置してくれる。

package main

import "fmt"

func f1() int { return 1 }
func f2() int { return 1 }
func f3() int { return 1 }
func main() {
  foo := f1() +
         f2() +
         f3()
  fmt.Println(foo)
}

*1:当然、ワンライナーで書くならセミコロンが必要