1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Tagliatelleで構造体のJSONタグのtypoを防ぐ

Posted at

Go強化月間とのことなので、Go関連の記事を上げていこうと思います。

TL; DR

  • Tagliatellegolangci-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_namefamily_namae になっていることに気づきましたか?)

スキーマごと自動生成すればtypoは起こりえませんが、既存のシステムだとすでに多くの構造体があって気軽に導入できないこともあると思います。

そこで本記事は、構造体のタグをチェックするlinter Tagliatelle (タリアテッレ) 1 を紹介します。

Tagliatelleの使い方

Tagliatelleは、フィールド名とタグの対応関係をチェックするlinterです。golangci-lint にも入っているので手軽に使えます。

タグの命名規則は10種類程度用意されていて、今回は snake_case なので snake を選択します。
(設定方法については README に解説があります)

.golangci.yml
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に組み込んでおけば、人手でレビューしなくても気づけるので良さそうです。

  1. 「タリアテッレ」はイタリアのパスタの種類らしいです。おいしそう(Wikipedia

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?