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

1
2
3
4
5
6
7
$ 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からそのまま貼る。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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を示したいときはnilかNoBody をBodyに格納する
Tags: Go
comments powered by Disqus