Go1.9rc1がリリースされました! そこで、Go1.9のリリースノートをさらっと見てみようと思います。 (まだrc1なので、今後変更される場合があります。ご注意を)

全部見ていくと、結構な量になりそうなので、すぐに影響のありそうな部分だけ、軽く見ていきましょう。

type alias

Go1.9ではType Aliasというものが導入されます。 これはその名の通り、型に別名をつけられるというもの。 言葉で説明するより、コードを見た方が早いと思いますので、コードを用意しました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package main

import (
	"fmt"
	"log"
)

type T1 struct {
	ID   string
	Name string
}

type T2 = T1

func main() {
	t := T1{
		ID:   "id",
		Name: "Taro",
	}
	log.Println("call t1.Call()")
	fmt.Println(t.Call())

	log.Println("call t2.Call2()")
	fmt.Println(t.Call2())

	return 0
}

func (t *T1) Call() string {
	return "hello, " + t.Name
}

func (t *T2) Call2() string {
	return "hi, " + t.ID
}

go1.8以前ではsyntax errorになるこのコードですが、go1.9では正常に動作し、以下のような出力をします。

1
2
3
4
5
$ go1.9rc1 run main.go
2017/07/26 09:38:27 call t1.Call()
hello, Taro
2017/07/26 09:38:27 call t1.Call2()
hi, id

tはT1型であり、Call2()が定義されているのはT2型ですが、T1型とT2型は同じものと見なされるので、T1型であるtからCall2()を呼び出すことができます。(ややこしい) この、Type Aliasが導入される背景などを説明した提案はproposa/18130-type-alias.md にあります。

ここで注意が必要なのは、C言語のtypedefのように、

1
type sp = *string

のようにすることはできないので注意が必要です(実際には上のコード自体は動作しますが、この型名を使おうとすると上手くいかないことが多いので、使用しない方が良いでしょう)

Vendor matching with ./…

以前より、./...とすることで、カレントディレクトリ以下を再帰的に探索してテストなどを行うことができました。 しかしここで問題となるのが、vendorディレクトリ内のパッケージで、テストの際はここを避けたい、といった要望も多かったようです。 実際、glide等ではglide nvコマンドなどにより、vendorディレクトリ以外を列挙するようなことができるようになっていました。

1.9からは、./...にはvendorディレクトリが含まれなくなりました。

go test -list

go testコマンドに-listフラグが追加されました。これは、引数として正規表現を与えることで、マッチするテストやベンチマークを(テストを実行せずに)列挙することができるオプションです。

Transparent Monotonic Time support

timeパッケージがモノトニック時刻をサポートするようになりました。

New bit manipulation package

math/bitsパッケージが新たに追加されました。 bitをカウントしたり、操作したりする関数群が含まれています。

Test Helper Functions

testingパッケージに、(*T).Helper()および(*B).Helper()が追加されました。 これは、呼び出された関数をヘルパー関数だとマークし、テストコードやその行数を出力するような場合にヘルパー関数をスキップする様になります。

そのほか、標準パッケージの変更

crypto/rand

Linux環境で、getrandomが十分なランダム性を用意できない場合、ブロックするようになりました。 もしブロックされた場合、goは/dev/urandomから乱数を取得します。

database/sql

database/sqlパッケージでは、Tx.Stmt()が呼ばれた際、キャッシュされたStmtオブジェクトがあればそれを利用するようになりました。

その他

実際には、もっと多くの変更があります。 詳しく知りたいかたはrelease note をご覧になって下さい!!!