Go強化月間とのことなので、Go関連の記事を上げていこうと思います。
TL; DR
-
Tagliatelle
を golangci-lint に設定して、JSONタグをスペルチェックしよう
はじめに
Goで構造体をJSONにmarshal/unmarshalする際、フィールドのタグに対応するキーを指定することが可能です。Goのフィールドは慣習的に PascalCase
ですが、JSONのキーは snake_case
にしたいという場合は多いと思います。
type Person struct {
GivenName string `json:"given_name"`
FamilyName string `json:"family_namae"`
Age int `json:"age"`
}
{"given_name":"Taro","family_namae":"Yamada","age":25}
しかし、タグ名とフィールド名の関係はあくまで開発者が決めたルールです。うっかりtypoしてしまうこともあるでしょう。
( family_name
が family_namae
になっていることに気づきましたか?)
スキーマごと自動生成すればtypoは起こりえませんが、既存のシステムだとすでに多くの構造体があって気軽に導入できないこともあると思います。
そこで本記事は、構造体のタグをチェックするlinter Tagliatelle
(タリアテッレ) 1 を紹介します。
Tagliatelleの使い方
Tagliatelleは、フィールド名とタグの対応関係をチェックするlinterです。golangci-lint にも入っているので手軽に使えます。
タグの命名規則は10種類程度用意されていて、今回は snake_case なので snake
を選択します。
(設定方法については README に解説があります)
linters:
disable-all: true
enable:
- tagliatelle
linters-settings:
tagliatelle:
case:
# タグ名のチェックにフィールド名を使用(trueにしないとフィールド名との対応がチェックされないので注意!)
# Default: false
use-field-name: true
rules:
# json以外にも、任意のタグ名をチェック可能
# 使えるルール: `camel`, `pascal`, `kebab`, `snake`, `goCamel`, `goPascal`, `goKebab`, `goSnake`, `upper`, `lower`
json: snake
想定通りエラーが指摘されました。
$ golangci-lint run
main.go:10:20: json(snake): got 'family_namae' want 'family_name' (tagliatelle)
FamilyName string `json:"family_namae"`
CIに組み込んでおけば、人手でレビューしなくても気づけるので良さそうです。