2014年11月16日日曜日

Golang Cafe #54を開催しました。

Golang Cafe #54を開催しました。今回は、Go1.4 Release Notesを読み進めました。

今回、読み進めた所は、以下の点です。

  • Changes to the language
    • For-range loops
    • Method calls on **T
  • Changes to the supported operating systems and architectures
    • Android
  • Changes to the compatibility guidelines
  • Changes to the implementations and tools
    • Internal packages
    • Canonical import paths
    • Import paths for the subrepositories
    • The go generate subcommand
    • Change to file name handling
    • Changes to package source layout
  • Performance
  • Changes to the standard library
    • Major changes to the library
      • syscall
    • Minor changes to the library
      • Testing周りを中心に見ました。

個人的に読み進めた部分をおさらいしたような流れになってしまいましたが、再度読み返してみて、わりといろんな所が変更になっていると思います。

For-range loopsの変更はブランク演算子("_")を書かなくても良くなった点が変更になっています。
次に、ポインタのポインタのメソッドを呼ぶ事が1.3以前では呼び出せていたものが、コンパイルエラーになります。

参考コード(Go Playgroundなので、1.4に置き換わるまでは動作します。)
http://play.golang.org/p/JTHWyVJ3V-(こちらは1.4でもビルドが通る)
http://play.golang.org/p/k-GxLYJOPO(こちらは1.4からコンパイルエラー)

以前のGolang Cafeでも話題になったように、ポインタをあまり使わないのであれば特に影響はありません。

Go1.4からのAndroidのサポートが増える件については、Qiitaの記事を見て動作確認をしてみてください。

いろいろ変更になっていますが、1.3以前までの互換性のガイドラインに変更はありません。(実際、1.0系/1.1系を使っているという方は、あまりいないかもしれませんが…アップデートを忘れている事例を除いて…)

他に増えたのが、
内部パッケージ(Internal Package)でパッケージのディレクトリ内に"internal"というディレクトリを作ると、同一パッケージ外から参照する事ができないパッケージを作ることができるようになります。

それから、Canonical Import Paths(標準的なインポートパス)ということで、package文の末尾にコメントを記入することで、ローカルのディレクトリ構成が正しい(≒go getしたものが正式である)時でないとコンパイルエラーにすることができるようになりました。
リポジトリもいろんなものがあるので、リポジトリを移設することも考えられるかもしれません。そういう時に古いリポジトリを参照しているといつまでも最新バージョンに置き換えられないことになるので、強制的にアップデートさせるのにいいかもしれません。
ただし、go get -uとかして、最新のコードが取得されていないとダメですが…。

Goの公式パッケージのリポジトリがGoogle Codeからgolang.orgに変更されます。
来年の6月1日から正式移行のようです。

go generateコマンド(実際には、コメントに書かれたコマンドを起動するだけのもの)が追加されました。最初は「ライブラリ作者には便利」とだけ認識していましたが、ビルド時に実行したいコマンドを書いておくことで、任意のコマンドを実行する事ができます。(大体はソースコードの自動生成で利用されることと思いますが…)

以前は、windows.goとか、amd64.goというファイル名でwindows専用だったり、64bit専用のソースコードとしてコンパイルされていましたが、これからはそれができなくなります。

あとは、テストコードを書く時に、これまでだと、全てのテストにsetupの処理と、teardownの処理を書かなくてはいけませんでしたが、Go1.4でTestMain()が追加になったので、全てのテストに共通した準備と後処理を書く事が可能になりました。Go本体だと、テスト後にメモリリークが発生しているかどうかのチェックを行うという使い方がされていました。

次回(これからですが)は、Goで大量データを処理するコードを書いて実行する。
ということをテーマに進めて行く予定です。