Go 1.17 がリリースされた

no extension

Go 1.17 がリリースされた。

毎度のごとく変更は多岐にわたるが,個人的に気になった部分を挙げておく。

  • スライス []T から配列ポインタ *[N]T への変換ができるようになったそうな
s := make([]byte, 2, 4)
s0 := (*[0]byte)(s)      // s0 != nil
s1 := (*[1]byte)(s[1:])  // &s1[0] == &s[1]
s2 := (*[2]byte)(s)      // &s2[0] == &s[0]
s4 := (*[4]byte)(s)      // panics: len([4]byte) > len(s)
// Deprecated: use example.com/mod/v2 instead.
module example.com/mod
  • ビルドの制御を行う // +build//go:build に変更になる。とりあえず 1.17 では両方有効らしい。サンプルファイルとか // +build run とか山ほど書いてるんだが,どうしよう…
  • go run コマンドがモジュール・バージョンを受け入れるようになった。これ GitHub Actions とかで重宝しそうだな(笑)
$ go run github.com/spiegel-im-spiegel/gpgpdump@latest -h
go: downloading github.com/spiegel-im-spiegel/gpgpdump v0.12.4
...
OpenPGP (RFC 4880) packet visualizer by golang.

Usage:
  gpgpdump [flags]
...
  • スタックではなくレジスタ・ベースの関数呼び出しがサポートされた。5%くらい速くなるらしい。サイズもちょびっと小さくなるようだ
  • 関数閉包(closure)を含む関数をインライン展開できるようになった
  • rune 型の変数が負値の場合に関連するメソッドがエラーとなるよう挙動が変わったようだ
  • go test-shuffle オプションが追加された。テスト順序をシャッフルしてくれるらしい
  • time.Time 型に GoString() メソッドが追加された。なんだこれ(笑)
package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Printf("%#v\n", time.Now())
	// Output:
	// time.Date(2009, time.November, 10, 23, 0, 0, 0, time.Local)
}

例によって Ubuntu の APT で管理している Go コンパイラは古いので,ダウンロードページからバイナリ(go1.17.linux-amd64.tar.gz)を取ってきて手動でインストールすることを強く推奨する。 以下は手動での作業例。

$ cd /usr/local/src
$ sudo curl -L "https://golang.org/dl/go1.17.linux-amd64.tar.gz" -O
$ cd ..
$ sudo unlink go # 以前の Go が入っている場合
$ sudo tar xvf src/go1.17.linux-amd64.tar.gz
$ sudo mv go go1.17
$ sudo ln -s go1.17 go
$ go version # /usr/local/go/bin にパスが通っている場合
go version go1.17 linux/amd64

アップデートは計画的に。 Zenn 記事の「Go のモジュール管理」は書き直さないとなぁ。

ブックマーク

参考図書

photo
プログラミング言語Go
アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)
丸善出版 2016-06-20 (Release 2021-07-13)
Kindle版
B099928SJD (ASIN)
評価     

Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想はこちら

reviewed by Spiegel on 2021-05-22 (powered by PA-APIv5)