LoginSignup
1
0

More than 1 year has passed since last update.

2021年,Go言語でお世話になったライブラリ/検討したけど導入しなかったライブラリ

Last updated at Posted at 2021-12-02

この記事は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とかなしでコレクション操作や地味すぎる型変換がシンプルにできるようになるといいですね...

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0