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

この記事は[Wanoグループ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/wano-group) 2日目の記事になります

今年、Go言語で新たにお世話になったライブラリや使用頻度が上がったライブラリを振り返ります。
けっこう今年は個人的にはGo周りは小ネタが多かったですね。。 
 


# 2021年、お世話になったライブラリ
### [github.com/deepmap/oapi-codegen](https://github.com/deepmap/oapi-codegen)
Open API 定義からGo言語のサーバーとかRequest/Response/構造体やモデル定義とかをGenerateするやつです。  
今年は一部プロジェクトで新たにOpenAPIでのスキーマ駆動開発をとりいれましたので、その際に導入しました。 
選定の理由は Open Api 3.0- に対応していた中で当時の言及数が多かったからです。
  
基本的にはモデル生成のみ使っています。

```bash
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](https://github.com/guregu/dynamo)
AWS DynamoDBを操作するためのSDKのラッパーです。  
冪等性チェックツールやイベントドリブンに向けたイベントストアをdynamoDBで作る機会があり、そこでお世話になりました。  
Go言語でdynamoといえばこれ！という感じで使用している方も多いのではないでしょうか。  
とにかくインターフェースがわかりやすいのでおすすめです。
シンプルなKVSとして使うだけならDynamoあまり知らなくてもテーブル定義すらこのツールだけで使えてしまうと思います。  
  
  
### [github.com/360EntSecGroup-Skylar/excelize](https://github.com/360EntSecGroup-Skylar/excelize)
GoでExcel操作するためのライブラリです。  
現行、excel系では一番Starが多いんじゃないかな?と思います。
  
Excelを自動処理しなければならない要件があり気が重かったのですが、これが仕事をとてもシンプルにしてくれました。  
Goの埋め込みとの相性も良く、テンプレートとなるExcelファイル自体を``` go:embed ``` で埋め込んでおき、``` embed.FS ``` で読み込み、データを書き込んでExport...
みたいなユースケースで使用していました。  

```go
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](https://github.com/iancoleman/strcase)
文字列のスネークケースやキャメルケースを相互変換するやつです。  
すごい地味に見えますが、 ``` go generate ``` で構造体を出力するようなツールを作るときに地味に何度もお世話になりました。  
mysqlのテーブル定義構造体を出力するようなライブラリなんかでもよく使われているようです。
  
   
### [github.com/gabriel-vasile/mimetype](https://github.com/gabriel-vasile/mimetype)
元々のmimeパッケージと違い、実際にファイルのヘッダを見て出力してくれるライブラリです。 
アップロードされてきたファイルのContent-TypeをDBに入れたり、AWS S3オブジェクトのContentTypeを任意で設定したいときに使いました。
  
  
### [github.com/Masterminds/sprig](https://github.com/Masterminds/sprig)
Go template の便利なFunctions集です。
環境変数の読み込みやbase64 のエンコード/デコード 関数なんかも同梱しています。  
``` text/teemplate ``` , ``` html/template ``` 両方で使えます。  
どんな便利そうなものがあるかは[こちらを参照](http://masterminds.github.io/sprig/) 
  
  
# 2021年、あんまり使わなくなった/検討したけど使用に至らなかったライブラリ
### [github.com/rclone/rclone](https://github.com/rclone/rclone)
[rclone](https://rclone.org/)はマルチクラウド/ファイルサーバ対応のファイル転送ツールです。 
cli自体は google drive の アップロード/ダウンロードにすごーくお世話になりました。
このツール自体がGo言語製だったので、**Goのプログラムから直接ライブラリとして読みこもう**と画策しましたが、設定がグルーバル変数だったりしてインスタンス化できず、あまりすっきりしなかった感じです。  
(...結局はGoからexecでrcloneコマンド自体を利用することになりました)  
  

### [github.com/rakyll/statik](https://github.com/rakyll/statik)
外部ファイルをGoのコードとしてgenerateしてくれるやつです。
言語仕様自体に ``` go:embed ``` が導入されてから新しく使うことはなくなりました。  
一部のGoのバージョンが古い共通リポジトリで残っているかな?というくらい。  
 

# 2022年
今年は小ネタが多かったですが、　　
来年はとにかく**Goのジェネリクス導入**に伴うライブラリの発展にすごく期待しています。
Generateとかなしでコレクション操作や地味すぎる型変換がシンプルにできるようになるといいですね...