この記事はWanoグループ Advent Calendar 2021 2日目の記事になります
今年、Go言語で新たにお世話になったライブラリや使用頻度が上がったライブラリを振り返ります。
けっこう今年は個人的にはGo周りは小ネタが多かったですね。。
2021年、お世話になったライブラリ
github.com/deepmap/oapi-codegen
Open API 定義からGo言語のサーバーとかRequest/Response/構造体やモデル定義とかをGenerateするやつです。
今年は一部プロジェクトで新たにOpenAPIでのスキーマ駆動開発をとりいれましたので、その際に導入しました。
選定の理由は Open Api 3.0- に対応していた中で当時の言及数が多かったからです。
基本的にはモデル生成のみ使っています。
oapi-codegen --package=api_v2_schema -generate types api/v2/api-v2.yml > api/v2/schema/openapi_schema.go
特に大きな不満はないのですが、けっこう愚直な構造なので、OpenAPIで宣言したネストしたモデルがGoのinline struct になったりして気持ち悪かったり、ハマりどころがないわけでもない...という感じです。
CIでの自動テストで毎回モデルを go generate
し、git diff があればエラーにしてテストを落とす、という感じでなるべく実装漏れを防いでいます。
github.com/guregu/dynamo
AWS DynamoDBを操作するためのSDKのラッパーです。
冪等性チェックツールやイベントドリブンに向けたイベントストアをdynamoDBで作る機会があり、そこでお世話になりました。
Go言語でdynamoといえばこれ!という感じで使用している方も多いのではないでしょうか。
とにかくインターフェースがわかりやすいのでおすすめです。
シンプルなKVSとして使うだけならDynamoあまり知らなくてもテーブル定義すらこのツールだけで使えてしまうと思います。
github.com/360EntSecGroup-Skylar/excelize
GoでExcel操作するためのライブラリです。
現行、excel系では一番Starが多いんじゃないかな?と思います。
Excelを自動処理しなければならない要件があり気が重かったのですが、これが仕事をとてもシンプルにしてくれました。
Goの埋め込みとの相性も良く、テンプレートとなるExcelファイル自体をgo:embed
で埋め込んでおき、embed.FS
で読み込み、データを書き込んでExport...
みたいなユースケースで使用していました。
package excel_task
import (
"embed"
"golang.org/x/xerrors"
"io/fs"
)
//go:embed template.xlsx
var static embed.FS
func LoadTemplate() (fs.File, error) {
f, err := static.Open("template.xlsx")
if err != nil {
return nil, xerrors.Errorf(`%v`, err)
}
return f, nil
}
...
// 読み込み
f, err := LoadTemplate()
if err != nil {
return "", xerrors.Errorf(`%+v`, err)
}
excelFile, err := excelize.OpenReader(f)
if err != nil {
log.Error(err)
return "", err
}
// 加工処理...
セルの色付けや複数シート操作なども楽にできたのでおすすめです。
github.com/iancoleman/strcase
文字列のスネークケースやキャメルケースを相互変換するやつです。
すごい地味に見えますが、 go generate
で構造体を出力するようなツールを作るときに地味に何度もお世話になりました。
mysqlのテーブル定義構造体を出力するようなライブラリなんかでもよく使われているようです。
github.com/gabriel-vasile/mimetype
元々のmimeパッケージと違い、実際にファイルのヘッダを見て出力してくれるライブラリです。
アップロードされてきたファイルのContent-TypeをDBに入れたり、AWS S3オブジェクトのContentTypeを任意で設定したいときに使いました。
github.com/Masterminds/sprig
Go template の便利なFunctions集です。
環境変数の読み込みやbase64 のエンコード/デコード 関数なんかも同梱しています。
text/teemplate
, html/template
両方で使えます。
どんな便利そうなものがあるかはこちらを参照
2021年、あんまり使わなくなった/検討したけど使用に至らなかったライブラリ
github.com/rclone/rclone
rcloneはマルチクラウド/ファイルサーバ対応のファイル転送ツールです。
cli自体は google drive の アップロード/ダウンロードにすごーくお世話になりました。
このツール自体がGo言語製だったので、Goのプログラムから直接ライブラリとして読みこもうと画策しましたが、設定がグルーバル変数だったりしてインスタンス化できず、あまりすっきりしなかった感じです。
(...結局はGoからexecでrcloneコマンド自体を利用することになりました)
github.com/rakyll/statik
外部ファイルをGoのコードとしてgenerateしてくれるやつです。
言語仕様自体に go:embed
が導入されてから新しく使うことはなくなりました。
一部のGoのバージョンが古い共通リポジトリで残っているかな?というくらい。
2022年
今年は小ネタが多かったですが、
来年はとにかくGoのジェネリクス導入に伴うライブラリの発展にすごく期待しています。
Generateとかなしでコレクション操作や地味すぎる型変換がシンプルにできるようになるといいですね...