golang1.9系から1.11.2にあげてみての感想
はじめに
業務で1.9系で使っていて1.11.2にあげた。
まぁリリースノートを見ればどの辺りがどう変わったかは大体わかるが、ある程度稼働しているコードのリポジトリでバージョンをあげる事で何となく得られる知見や理解が深まった部分があったので残しておく
Go 1.9 Release Notes - The Go Programming Language
Go 1.10 Release Notes - The Go Programming Language
Go 1.11 Release Notes - The Go Programming Language
test関連
vet
今まではcircleciのjobにvetやlintだけを流す静的チェック系のテストを定義していたが、test実行のまえにvetが-vet=off.
にしない限り自動で動く。
なのでcircleciのjobを減して良いなと感じた
https://golang.org/doc/go1.10#test
test結果のキャッシュ
修正を加えていない部分に関しては毎回テストが走る事がなく、キャッシュからresultを返してくれる。
testは早ければ早いほど自分は嬉しいのですごくありがたい。
もちろん、キャッシュをさせずに一通り実施したい場合はオプションが存在する -count=1
ちなみにどこにキャッシュを作ってるのだろうかと気になって調べて見たら書きに書いてあった
https://github.com/golang/go/blob/master/src/os/file.go#L346-L382
macであれば$HOME/Library/Caches
配下ですね
へーっと思ったら、その辺りを解説されているエンジニアさんがいらっしゃいました
How Go cache tests - Speaker Deck
先にこのスライドを目にしていれば...
bug fix系かな
1.
loggingにlogrus
を使っているが、今ままで下記のようなコードがあった
GitHub - sirupsen/logrus: Structured, pluggable logging for Go.
if err != nil { Logger.Errorf("failed to xxx err:%#v, p_id:%d, u_id:%d", err, iv.PxxxID, iv.UxxxID) }
iv.PxxxID
はint
だったが、iv.UxxxID
はsql.NullInt64
でした。がエラーにはなっていませんでしたが、1.11.2にあげてからは怒られるようになりました。
正しく、iv.UxxxID.Int64
としてあげなきゃいけないなと気づけてありがたい。
なので下記のように修正
if err != nil { Logger.Errorf("failed to xxx err:%#v, p_id:%d, u_id:%d", err, iv.PxxxID, iv.UxxxID.Int64) }
2.
これまだ要調査という感じですが、下記のようなコードがあったとします。
main.go
func sample() string { var i float64 i = 444 fmt.Printf("%d",i) return "aaa" } func main() { fmt.Println(sample()) }
main_test.go
func TestMain_sampe(t *testing.T) { actual := sample() expected := "aaa" if actual != expected { t.Errorf("got: %v\nwant: %v", actual, expected) } }
1.9.7の場合
go run main.go
すると私の期待値通り%!d(float64=444)aaa
と返ってくるgo test -run TestMain_sampe
すると問題なくPASSする
1.11.2の場合
go run main.go
すると私の期待値通り%!d(float64=444)aaa
と返ってくるgo test -run TestMain_sampe
すると./main.go:13: Printf format %d has arg i of wrong type float64
という感じで怒られる
ちなみにbuildはどちらでも何もエラーを出力する事なくできました。
go run
とgo test
をもうちょっと詳しくならないと理由がわからないですね。次の持ち越し課題にしておく。
goimports
indentがちゃんと揃うようになった
before
i := &models.Ixxxx{ PxxxxxxID: i.PxxxxxxID, TotalxxxxxxxxxPrice: sql.NullInt64{Int64: i.TotalxxxxxxxPrice, Valid: true}, UxxxID: sql.NullInt64{Int64: i.UxxxID, Valid: true}, Type: sql.NullInt64{Int64: i.Type, Valid: true}, }
after
i := &models.Ixxxx{ PxxxxxxID: i.PxxxxxxID, TotalxxxxxxxxxPrice: sql.NullInt64{Int64: i.TotalxxxxxxxPrice, Valid: true}, UxxxID: sql.NullInt64{Int64: i.UxxxID, Valid: true}, Type: sql.NullInt64{Int64: i.Type, Valid: true}, }
vetをかけた際に出ていたcannot load packageが解決された
以前はgo vet -v ./...
をした時によく(can't find import: ~
と出てたが、そのloadが解決されてちゃんと動くようになった
最後にちょっと気になっているところ
1.11でWebAssembly
やvgo
といったところが出ていた。まだ全然試せていないが、vendor
も時期に消し去る時がくるようだなーと。