GoogleがGo 1.4を発表した。Go 1.3から半年ぶりのリリースだ。Go 1.4では「絶賛開発中」のAndroidネイティブ開発の公式サポートと、改善されたガベージコレクションやマイナーな言語変更が追加されている。
数ヶ月前にInfoQがレポートしたように、GoogleのエンジニアたちはネイティブAndroidアプリをGoで書けるようにする提案に取り組んできた。Go 1.4でGoogle案のAndroidへの実験的ポートが実現し、GoチームのGoogleエンジニアAndrew Gerrand氏は「GoだけでシンプルなAndroidアプリが書けるようになった」と書いている。
Androidのサポートはgolang.org/x/mobileリポジトリを通して提供される。ここには完全なネイティブアプリを作るため、JavaからGoコードの呼び出しを可能にする言語バインディングを生成するためのパッケージ、いくつかのサンプル、OpenGLのためのバインディングが含まれている。
ここで思い出さなくてはならないのは、Googleの計画はGoで完全なAndroid NDKを提供することが目的ではなく、「Android NDKで提供されるもっと小さなCベースのAPI界面」を使ってAndroidアプリの一部をGoで書けるようにすることだけだということだ。リリースノートには次のように書かれている。
提供されるインターフェイスはゲームにフォーカスしています。アプリは全画面に描画され(OpenGL経由で。go.mobile/glパッケージを参照)、プラットフォームの画面管理インフラを見せないことを想定しています。つまり、Androidにおけるネイティブアプリは単一のActivity(具体的にはNativeActivity)相当、iOSだと単一のUIWindow相当になるということです。Touchイベントはこのパッケージ経由でアクセスできます。プレビュー段階を終えたときには、GoパッケージからAndroid NDKによってサポートされる全APIが見えることになるでしょう。
さらにAndrew氏は発表でこう述べている。
「現在のところ、サポートライブラリはまだ初期段階で絶賛開発中です。アーリーアダプターは覚悟して使ってください。でもコミュニティの参加は大歓迎です。」
Go 1.4には、ガベージコレクタを改善し、今後数リリースで展開される完全なコンカレントコレクタの基盤となる作業が多数含まれている。さらに、連続性を保証する必要があるときスタックはリアロケートされ、悪名高き"hot stack split"問題を取り除いている。
ツールも改善されている。go
コマンドはビルト時のソースコード生成をサポートする。これは新しいstringerツールを使った型付き定数のためのString
メソッドの生成の自動化に使われる。Andrew氏はこう語る。
最後に、Go 1.4には言語変更がいくつか追加されています。
-
新しい
for-range
ループ形式。for range x { ... }
以下の代わりになる。
for i := range x { ... }
-
**Tにおけるメソッド呼び出しの禁止。以前は次のようなメソッド呼び出しが許されていた。
type T int var x **T x.M()
これは自動的に1つの参照外しの挿入しか許していないGo言語仕様に準拠していなかった。以前の振る舞いに依存しているコードはコンパイルできなくなるが、変数を明示的に参照外しすることで簡単に修正することができる。
詳細については、リリースノートを参照してほしい。