Go 1.25 のリリース
予定通り8月に Go 1.25 がリリースされた。
- Go 1.25.0 is released
- Go 1.25 Release Notes - The Go Programming Language
- Go 1.25 is released - The Go Programming Language
リリースノートをざっと眺めて個人的に気になった部分をピックアップする。
go.mod に ignore ディレクティブを追加
go.mod
ファイルの記述に ignore
ディレクティブが追加された。
これを使うことで Go コマンドの解析対象から除外するディレクトリを指定できる。
たとえば
module example.com/my/module
go 1.25
ignore ./node_modules
ignore (
static
content/html
./third_party/javascript
)
みたいな感じ。
Go のコードとは関係ないディレクトリに大量のファイルがある場合は ignore
ディレクティブで対象ディレクトリを指定することによって Go コマンドの解析効率を上げる,というのが目的らしい。
nil ポインタに関するバグの修正
たとえば
package main
import "os"
func main() {
f, err := os.Open("nonExistentFile")
name := f.Name()
if err != nil {
return
}
println(name)
}
というコードで os
.Open()
関数で失敗した場合,本来は f
に nil
が入ってるはずなので name := f.Name()
の部分で panic になる筈なのだが,1.21 以降 1.24 以前のバージョンでは err != nil
のチェックが行われるまで評価が遅延されてしまい panic にならずに通ってしまっていたらしい。
上述のコードの場合は実害なさげだが,もっと複雑なコードでは問題になるかもしれない。
というわけで 1.25 では上述のコードの場合,正しく panic を吐くよう修正された。 併せて,エラーチェックに関しては
package main
import "os"
func main() {
f, err := os.Open("nonExistentFile")
if err != nil {
return
}
name := f.Name()
println(name)
}
のように,可能な限り error
を返す関数の直後に err != nil
のチェックを行うよう推奨している。
encoding/json/v2 パッケージの実験的実装
ついに encoding/json/v2
パッケージが実装された。
ただし,今のところは experimental implementation であり,今後のバージョンとの互換性は保証されていないため,取り扱いには注意が必要である。
新しいパッケージを有効にするには,ビルド時に環境変数で GOEXPERIMENT=jsonv2
と指定する必要がある。
また,この環境変数をセットすることで従来の encoding/json
パッケージの内部実装も v2
ベースに切り換わるらしい。
というわけで,今の encoding/json
パッケージで問題がないのであれば v2
パッケージへの移行は今のところは保留しておいたほうがいいかもしれない。
ただし encoding/json
パッケージの最新ドキュメントには
For historical reasons, the default behavior of v1 encoding/json
unfortunately operates with less secure defaults. New usages of JSON in Go are encouraged to use encoding/json/v2 instead.
などと記されており,将来的には v2
パッケージへの移行が必要になるだろう。
その他
- コンテナ対応の
GOMAXPROCS
- 新しい実験的な GC
- ビルド時に環境変数に
GOEXPERIMENT=greenteagc
を指定
- ビルド時に環境変数に
runtime/trace.FlightRecorder
APIcrypto
パッケージの改良- Windows で
os
.NewFile()
の改良。 non blocking I/O のサポート
他にも様々な変更・改良がある。
Go 1.25.0 の導入
Ubuntu の APT で管理している Go コンパイラは古いので,ダウンロードページからバイナリ(go1.25.0.linux-amd64.tar.gz
)を取ってきてインストールすることを推奨する。
以下は完全手動での作業例。
$ cd /usr/local/src
$ sudo curl -LO "https://go.dev/dl/go1.25.0.linux-amd64.tar.gz"
$ cd ..
$ sudo unlink go # 以前の Go が入っている場合
$ sudo tar xvf src/go1.25.0.linux-amd64.tar.gz
$ sudo mv go go1.25.0
$ sudo ln -s go1.25.0 go
$ go version # /usr/local/go/bin にパスが通っている場合
go version go1.25.0 linux/amd64
Windows はインストールパッケージを取ってきて直接インストールする。 Scoop 経由でも OK
複数バージョンの Go コンパイラを扱いたい場合は
$ go install golang.org/dl/25.0@latest
$ go1.25.0 download
$ go1.25.0 version
go version go1.25.0 linux/amd64
てな感じに導入できる。
ブックマーク
(随時追加予定)
参考図書
- プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
- 丸善出版 2016-06-20
- 単行本(ソフトカバー)
- 4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN)
- 評価
著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。と思ったら絶版状態らしい(2025-01 現在)。復刊を望む!
- 効率的なGo ―データ指向によるGoアプリケーションの性能最適化
- Bartłomiej Płotka (著), 山口 能迪 (翻訳)
- オライリー・ジャパン 2024-02-24
- 単行本(ソフトカバー)
- 4814400535 (ASIN), 9784814400539 (EAN), 4814400535 (ISBN)
- 評価
版元で Ebook を買える。Go言語のリファレンス本ではない。フトウェア工学,プログラミング(の考え方)を学ぶ教科書的な位置づけかなぁ。
- Go言語で学ぶ並行プログラミング 他言語にも適用できる原則とベストプラクティス impress top gearシリーズ
- James Cutajar (著), 柴田 芳樹 (著)
- インプレス 2024-12-04 (Release 2024-12-04)
- Kindle版
- B0DNYMMBBQ (ASIN)
- 評価
読書会のために購入。インプレス社の本は Kindle 版より版元で PDF 版を買うのがオススメ。「並行処理」について原理的な解説から丁寧に書かれている。 Go で解説されているが Go 以外の言語でも応用できる。