Update to Go 1.8
先日Go1.8 がリリースされた。 ソースコードからビルドしたら失敗した。 調べてたらIssueが上がっていて対処が判明したのでメモしておく。 ついでなのでリリースノートについても目を通した。
ソースコードからインストール
以下の環境でgoのビルドが失敗した。目的はgo1.8だったけど試すと他のバージョンも失敗する様になっていた。 調べたところSierraで起きているとのこと。
項目 | 値 |
---|---|
コンパイラバージョン | v1.4.3 |
OS | OSX Sierra(v10.12.3) |
GOROOT |
/usr/local/go |
対処自体は簡単でGOROOT_BOOTSTRAP
をgo1.7.1に向ける。
goのビルドにはgoが必要でドキュメントでは1.4で行う様に書かれている。
これをgo1.7.1に変更すれば良い。
ビルド用のgoは${HOME}
配下に置くのが慣例なので今回も従う。
その結果、以下の様になる。
|
|
リリースノートのイントロダクション
下記の項目が変更点として加わった。
- 名前付き構造体間での型変換(conversion)がサポートされた
- 16bit浮動小数点をサポートすることを要求
- 32bit MIPSがサポートされる
- Compiler BackEnd が改善される(より効率の良いコードを生成)
- SSAに基づくバックエンドが全サポートアーキテクチャを網羅し一本化が図られた
- x86_64ではVBROADCASTSD,BROADCASTSS など利用されるSIMD命令が増えている
- GCが改善される(stop-the-worldを伴うstack rescaningがなくなった)
- HTTP/2 Pushがサポート
- HTTP graceful shutdownがサポート
- context のサポート強化
- mutexのprofilingが可能になった
- 単純にソート可能なスライスが提供される
言語仕様の変更
- 名前付き構造体間での型変換(conversion)がサポートされた
- 16bit浮動小数点をサポートすることを要求
名前付きの構造体間での型変換(conversion)が簡単になっていて便利になりそう。 型システムが公称型(nominative)から構造型(structural)に変更されるわけではない。
タグは型の一部だけど変換では考慮されない仕様となった。 サンプルをRelease Noteからそのまま貼る。
|
|
元々は2013年にIssueが登録されて議論の中でrobpikeがアクセプトしていたもので、 アサインされたgriesemerがその後specを提案して 正式なproposalにしていたもの。
Tools
気になったものを少し拾う。
- Yaccがgo toolから外れるgolang.org/x/tools/cmd/goyacc へ移動
- Vetが厳しくなる
- PprofでTLS Serverのプロファイルが可能になるスキーマはhttps+insecureを用いる
- Pluginがサポートされた(現在はLinuxのみ)
Performance
Defer, Cgo, GCで性能上の改善がなされた。
Standard Lib.
- sort.SortStable(interface{}, func(int, int)bool) が追加された
- http,sql,net などでcontext を受け付ける範囲が広がった
- ParseDuration() が小数表示も受け付けるようになった
- httputil.ReverseProxy でレスポンスを加工できる
- net/http/httptrace.ClientTrace に2つのメソッドが加わりTLSハンドシェイクをトレースできる
- tls パッケージの強化でハンドシェイクの詳細に立入れる様になった
- http.Request.ContentLength が0の時に、長さを決めるためにBodyを読みださなくなった
- 明示的に0を示したいときはnilかNoBody をBodyに格納する