こんにちは、SWEの小島です。普段は社内向けの通知基盤の開発・運用をしています。
みなさん、Googleが公開しているGo Style Guideはご存知でしょうか?
2022/11に公開された時はXや国内のGoコミュニティでも話題になっていたと思います。また、Go conference 2023では自分がこのガイドをテーマに発表したりもしましたので読んだことある・存在は知っている人も多いと思います。
Go Style Guideとは何かやこのドキュメントの立ち位置などについては過去に発表した時に個人的にまとめたものが資料に記載してありますので、気になる方はそちらも見てみてください。
自分は公開された当初に読んだ後も、開発中書き方に悩んだ時に見たりコードレビュー等で書き方のサンプルとしてメンバーに共有したりと不定期に活用していました。そうして活用していたある時、ガイドの中にGo 1.24についての記述があることに気づきガイドが更新されていることを知りました。
(このガイドが公開されたのは 2022/11 時点でのGoの最新バージョンは1.19ですので、公開時にはこの記述はなかったはずです。)
このように自分は更新されていたことを知らなかったのですが、これを期に公開されてからどこが更新されていたのかを調べ、更新されていた中で興味深かった点をいくつか紹介したいと思います。
どうやって調べるか
Google Go Style Guide自体は https://google.github.io/styleguide/go/ で公開されていますが、コンテンツ自体は他の言語のStyle Guideとまとめてgoogle/styleguideリポジトリで管理されているようです。
その中でもGoに関してはgoディレクトリの下にまとまっているので、このディレクトリの更新履歴を確認すれば更新されたタイミングと更新の中身が確認できそうです。
ちなみに更新履歴を見るとどうやらGoogle内部で更新があった後に、不定期に内容が反映されているようでした。
主要な更新の紹介
Protoライブラリのimport時リネームについて
Best Practices > Import > Protocol Buffer Messages and Stubs
項目名が Protos and stubs から Protocol Buffer Messages and Stubs に名前変更されています。 また、このセクションではimportのリネーム方針が大幅に変更されていました。
// 以前推奨されていた名前 import fspb "path/to/some/filesystem/proto" // 現在推奨されている名前 import filesystempb "path/to/some/filesystem/proto"
この変更について、ガイドに以前記載されていた内容から大きな変更なこともあり、ガイドでは以下のように以前の記載からの変化についても言及されています。
Note: Previous guidance encouraged very short names such as "xpb" or even just "pb". New code should prefer more descriptive names.
パッケージ外で宣言された構造のフィールド名指定の必須化
Decisions > Language > Literalformatting > Field names
以前のガイドではパッケージ外で定義された型に対してフィールド名を指定することが「should usually」となって、構造と順序が安定されている小さい構造体の場合にはフィールド名を省略できるとしていました。
更新によってフィールド名を省略する例が削除され表現も「must」に変更されています。
// 以前は省略可能だった例が削除された // Field names may be omitted within small, simple structs... // okay := image.Point{42, 54} // これは推奨されなくなった // 現在は明示的なフィールド名が必須 also := image.Point{X: 42, Y: 54}
Best Practices > Documentation > Errorsの項目が増えた
Best Practices > Documentation > Errorsの項目自体が追加されてます。
この項目では関数が返すエラーについてドキュメントに記載すべき内容について触れられています。
例えば、呼び出し側がerrors.Is,errors.As,package cmpを使って正しく比較できるようにエラーがポインタレシーバであるかどうかをドキュメントに書くといったことが説明されています。
Package sizeについて具体的な内容が増えている
Package sizeについての内容が増えており、具体的には以下の内容が追加されています 。
- ユーザがどちらからのpackageを利用するために2つのpackageをimportする必要がある場合は、それらを1つのpackageにまとめることは正しい選択になると説明
- 概念を実際に示すのに役立つ、non-canonicalな例
サブテストの命名について
Decisions > Test structure > Subtests > Subtest names
サブテストの命名についてテストランナーの文字変換を考慮した名前をつけるべき理由の説明が追加されています。
具体的には、テストランナーはスペースをアンダースコアに置き換え、非表示文字をエスケープするため、テストのログとソースコード内の名前を一致させるためにこれらの文字の使用をさけることが推奨されています。
その他の更新
- テスト時のcontext使用について、従来の
context.Background()からtb.Context()の使用が推奨されるように追記されている - log.slogのリンクが増えている
- interface{}がanyになっている
- ファイル名には_を使用しても問題ないとのNoteが追加されている
- 一部の箇所のパラグラフのタイトルが変更されている
まとめ
Google Go Style Guideは公開されて終わりではなく、Go言語の進化やGoogle内部でのベストプラクティスの蓄積に合わせて継続的に更新されているようです。 ただ、ドキュメント自体には更新履歴は特に記載されていないようなので一度読んだことがあった差分だけ気になるような人はgithubから差分だけ確認してみるのがいいと思います。