its: 対応している go のバージョンを訂正します
みなさんこんにちわ。go のテストマッチャライブラリ its を書いています、youta-t です。
今回は、対応 go バージョン訂正のお知らせのために筆を執りました。
its は go1.21 以上でお使いになれます
これまで go1.18以上だ、と言ってきましたが、間違っていました。ごめんなさい。
試してみた方には、あれ、うまく動かないな、という体験をされた方も、もしかしたらいらっしゃるかもしれません[1]。すみませんでした。
顛末
反省の意味もこめて、何があったのかを書き留めておこうと思います。
go.mod
には最初から go 1.18
と書かれていました。
それで、1.18の文法で go test
やコンパイルが通っているものと考えていました。結果的には、これが勘違いでした。
さて、エディタ(VSCodeでした)の設定を見渡していたところ、go のバージョンが 1.21 に指定されているな、という事に気が付きました。
VSCode は、ここに go の環境を表示していて、実際に go
コマンドがこのバージョンを参照するように、PATH
環境変数を調整します。
このあたりで不安になって、改めて VSCode の go 環境を 1.18 系に指定し直してテストを流したところ、コンパイルエラーを検出した、という次第です。
実装を調整しようと試みましたが、ジェネリクス周りの文法と型推論の機能が足りず、1.18対応をしきることができませんでした。
それでひとまず、 1.21 以降対応に変更する、ということに致しました。
ところで
では結局のところ、 go.mod
の go
ディレクティブって何なんでしょう?
ドキュメントに当たってみましょう。
Before Go 1.21, the directive was advisory only; now it is a mandatory requirement: Go toolchains refuse to use modules declaring newer Go versions.
For packages within the module, the compiler rejects use of language features introduced after the version specified by the go directive. For example, if a module has the directive go 1.12, its packages may not use numeric literals like 1_000_000, which were introduced in Go 1.13.
......というわけで、go1.21 以降であれば、 go
ディレクティブを見て、新しすぎるモジュールについて拒否してくれる... はず?
うーん、たしかにこの記述を見た記憶があり、それで go.mod
にバージョンが書いてあるから安心だ、と思ってはいたのです。しかし私の環境ではそうなっていませんでした。一体何故でしょう...?
あのあとバージョンを切り替えたり go mod edit -go
したりしながら試してみましたが、どうにも go
ディレクティブは無視されているように見えました。
原因はいまもよくわかりません。今後当面は、 go.mod
の記述とエディタの設定を揃えて開発することにします。
追記
VSCode の 外 で go test ./...
したら、go
ディレクティブが斟酌された挙動を示しました。
VSCode がなにかしてるのか...?
いや、そういうわけでもないみたい...
答え(の半分)
golang のメーリングリスト "golang-nuts" に、私と同じような疑問をもった方が投稿をしていました。
その質問への答えに曰く「go
ディレクティブは、言語機能は制限するけど、標準ライブラリについては制限しないよ」とのこと。
たしかに... slices
や cmp
をつかっていたことについて言えば、このコメントの通りなら納得がいきます。私の誤解だった、ということでしょう。
ではジェネリクスの型引数の推論については...? 釈然としないものが残ります。
とはいえ、少なくとも標準ライブラリの内容については go
ディレクティブで制限できない以上、go
ディレクティブに頼り切りになるのは良くない、ということですね。
-
一方で、とにかく最新版!というひとは、なんかすんなりつかえてしまったことでしょう。 ↩︎
Discussion