鱒身(Masu_mi)のブログ

知った事をメモする場所。

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}配下に置くのが慣例なので今回も従う。その結果、以下の様になる。

$ mkdir tmp && cd ./tmp
$ wget https://storage.googleapis.com/golang/go1.7.1.darwin-amd64.tar.gz
$ tar -xvf ./go1.7.1.darwin-amd64.tar.gz
$ mv ./go ${HOME}/go1.7.1
$ cd /usr/local/go/src
$ git checkout go1.8
$ GOROOT_BOOTSTRAP=~/go1.7.1/ ./all.bash

リリースノートのイントロダクション

下記の項目が変更点として加わった。

  • 名前付き構造体間での型変換(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からそのまま貼る。

func example() {
  type T1 struct {
    X int `json:"foo"`
  }
  type T2 struct {
    X int `json:"bar"`
  }
  var v1 T1
  var v2 T2
  v1 = T1(v2) // now legal
}

元々は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を示したいときはnilNoBodyBodyに格納する