Go 1.11の中心的な機能はWebAssemblyとモジュールの２つだが、いずれも実験段階に留まっている。

モジュールは GOPATH の代替手段として、プロジェクトの依存関係の特定とバージョニング管理を提供するものだ。モジュールが存在する $GOPATH/src 以外のディレクトリ内で go コマンドが実行された場合にはモジュールが有効になり、それ以外では GOPATH が使用される。GoogleのRuss Cox氏が説明している。

Goモジュールはモジュールパスと呼ばれる、共通のインポートパスプレフィックスを共有するパッケージのコレクションです。モジュールはバージョニングの単位でもあり、モジュールのバージョンはセマンティックバージョン文字列で記述されます。Gitで開発する場合、モジュールのGitリポジトリにタグを追加することで、モジュールの新たなセマンティックバージョンが定義されます。セマンティックバージョンを強く推奨していますが、指定したコミットの参照もサポートされます。

モジュールは go mod を使って生成され、そのバージョン番号のパッケージが必要とするパッケージをすべてリストアップした go.mod ファイルを、モジュールのルートに置くことで定義される。これは go mod -init -module example.com/m で生成したもので、モジュールのベースディレクトリと２つの依存ファイルの定義された、ごく単純なモジュール定義ファイルの例である。

module example.com/m require ( golang.org/x/text v0.3.0 gopkg.in/yaml.v2 v2.1.0 )

go.mod ファイルが生成されれば、後は go build 、 go test 、 go list といったコマンドが、インポートを満足するように新たな依存関係を自動的に追記してくれる。例えば、メインパッケージで rsc.io/quote をインポートしている場合、 go run を実行することで、 require rsc.io/quote v1.5.2 が go.mod に追加される。同様に go get コマンドは、 go.mod を更新してビルドに使用されるモジュールのバージョンを変更するので、依存関係を再帰的にアップグレードないしダウングレードすることが可能だ。

モジュール構文の詳細は go help modules で確認できる。Goチームが互換性の維持に努力しているため、この機能は、少なくともGo 1.12までは試験段階に留まる予定である。モジュールが安定した時点で、GOPATHによる作業サポートは削除される。

WebAssemblyのサポートは、Webブラウザ内でGoプログラムを実行可能にするためのものだ。 GOARCH=wasm GOOS=js go build -o test.wasm main.go を実行して、Webで動作するGoプログラムをコンパイルすると、 wasm_exec.html , wasm_exec.js , test.wasm という3つのファイルが生成され、HTTPサーバにデプロイするか、あるいはブラウザに直接ロードすることができる。 js パッケージを使用したDOM操作も可能だ。

Go 1.11の変更点の全リストは、公式リリースノートで確認して頂きたい。 利用可能なダウンロードのリストはこちらにある。