概要
今回は小ネタで、2025年現在利用しているものの記録です。カテゴリ分けとして以下にまとめてみました。
- CLI
- Web
- その他開発系
CLI
- なし
フラグやサブコマンドのライブラリ( urfave/cli, spf13/cobra, jessevdk/go-flags )を使ったこともありました。しかし、ライブラリとその依存のアップデート対応の手間を鑑みて、最終的に10年くらい前にWeb読んだ記事(消滅済み)の記憶を元に標準ライブラリで書いています。記事が消えてしまったので曖昧な記憶ですが
- 入出力は
io.Rader/io.Writerで定義しておいてmain関数で実行時はos.Stdin/os.Stdoutを渡し、テスト実行時はstrings.Reader/bytes.Bufferなどを渡して使う - コマンドは引数と入出力(あるいはその構造体)を受け取って終了ステータスを返す
- コマンドを実行する関数は引数を受け取ってコマンドを実行し、終了ステータスで
os.Exitする - main 関数はコマンドを実行する関数を実行するだけ
- フラグはフラグ解析後のデータを格納する構造体を定義して、引数を加工して構造体にマッピングする
- ディフォルト値を設定したい設定ファイルのハンドリングにFunctional Options Pattern使う
あたりは書いてあった気がします。
2025年的には
により詳細に説明があり、GitHub にサンプルもあるので、それを参照しながら書くのが良いかなと思います。
同資料中にもありますが、 CLI は運用作業用のものが多いので、ユーティリティー用のライブラリ(とその依存)で頻繁にアップデートがかかるのは手間です。ほどほどで対応できるようにするためにあまり使わなくなったかなと思います。
Web
- oapi-codegen/oapi-codegen
- google.golang.org/protobuf
- bufbuild/buf
- connectrpc/connect-go
- sqlc-dev/sqlc
- golang-migrate/migrate
- go-oauth2/oauth2
- golang-jwt/jwt
REST API は OpenAPI に沿って作るので oapi-codegen。RPC系は元々 protobuf + gRPC だったのを buf + connect どうかなと検討しています。現在の用途だとどのみちフロンエンドから grpc-gateway 的な REST へのブリッジが必要なので積極的に対応が進められていないのですが。
ごく小規模ということもあって Web サーバは標準の net/http で書いていて、あまり Webフレームワークを使ったことがありません。少し使ったのが
くらいでしょうか。
SQL 系は5年くらい前に「あまり自動生成部分が多くないやつ」くらいで検討して以降再検討していないので今だともっといいものがあるのかもしれません。 sqlc だと複雑なクエリに対応しづらいのはあるのですが、大きい不満はないので変えていない状態です。
OAuthは2.1の需要が出てきたのでPKCEの対応の検討があります。JWTは諸々使っています。
その他開発系
用途バラバラなのでそれぞれに記載します。利用クラウドインフラや連携SaaSのSDKやクライアントライブラリを除くと以下くらいでしょうか。
-
golangci/golangci-lint
- Linter
-
stretchr/testify
- テスト用。assert/mock/test_suiteを使ってます
-
vektra/mockery
- testify 形式のモック生成用
-
testcontainers/testcontainers-go
- テストコード中でコンテナ立ち上げてテストしたいときに
-
uber-go/zap
- ログ
開発系のCLIはバイナリしか使っていないとRust製なのか、Go製なのか意識してないので実際にはもっとあるかもしれませんが。
おわりに
定期的に書いて何が理由で変更したかが分かるようになっているといいかなと思っています。