Go の 構造体のタグを取得する

備忘録。

json などで構造体のフィールドに付ける json:omitempty などのタグを取得する方法について。


構造体フィールドのタグは標準パッケージ reflect を使って実行時に取得する。

以下、構造体 Tagged のフィールド Foo に付いているタグを取得するサンプル。

package main

import (
    "fmt"
    "reflect"
)

type Tagged struct {
    Foo string `tagA:"aaa" tagB:"bbb,ccc"`
}

func main() {
    var tagged Tagged

    // 型情報を取得
    var t reflect.Type = reflect.TypeOf(tagged)

    // Foo のフィールド情報を取得
    var f reflect.StructField
    var ok bool
    f, ok = t.FieldByName("Foo")
    if !ok {
        panic("Foo is not found")
    }

    // Foo のタグを取得
    var tag reflect.StructTag
    tag = f.Tag

    // tagA の値を取得
    fmt.Printf("tagA: %#v\n", tag.Get("tagA")) // => "aaa"

    // tagB の値を取得
    fmt.Printf("tagB: %#v\n", tag.Get("tagB")) // => "aaa"

    // 存在しないタグに対しては空文字列を返す
    fmt.Printf("tagC: %#v\n", tag.Get("tagC")) // => ""

    // Lookup を使うと存在判定ができる
    _, ok = tag.Lookup("tagC")
    fmt.Printf("tagC exists: %#v\n", ok)
}