Go 1.25 のリリース

no extension

予定通り8月に Go 1.25 がリリースされた。

リリースノートをざっと眺めて個人的に気になった部分をピックアップする。

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() 関数で失敗した場合,本来は fnil が入ってるはずなので 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 API
  • crypto パッケージの改良
  • 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

てな感じに導入できる。

ブックマーク

(随時追加予定)

参考図書

photo
プログラミング言語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 現在)。復刊を望む!

reviewed by Spiegel on 2016-07-13 (powered by PA-APIv5)

photo
効率的なGo ―データ指向によるGoアプリケーションの性能最適化
Bartłomiej Płotka (著), 山口 能迪 (翻訳)
オライリー・ジャパン 2024-02-24
単行本(ソフトカバー)
4814400535 (ASIN), 9784814400539 (EAN), 4814400535 (ISBN)
評価     

版元で Ebook を買える。Go言語のリファレンス本ではない。フトウェア工学,プログラミング(の考え方)を学ぶ教科書的な位置づけかなぁ。

reviewed by Spiegel on 2024-04-21 (powered by PA-APIv5)

photo
Go言語で学ぶ並行プログラミング 他言語にも適用できる原則とベストプラクティス impress top gearシリーズ
James Cutajar (著), 柴田 芳樹 (著)
インプレス 2024-12-04 (Release 2024-12-04)
Kindle版
B0DNYMMBBQ (ASIN)
評価     

読書会のために購入。インプレス社の本は Kindle 版より版元で PDF 版を買うのがオススメ。「並行処理」について原理的な解説から丁寧に書かれている。 Go で解説されているが Go 以外の言語でも応用できる。

reviewed by Spiegel on 2025-01-25 (powered by PA-APIv5)