JSON や BSON などの形式はシリアル化されており、オブジェクト リレーショナル マッピング (ORM) システムは構造タグを使用します。これらのシステムはタグを使用して、処理中にフィールドに必要な特別なプロパティと可能な動作を設定します。これらの情報は静的であり、構造をインスタンス化せずにリフレクションを通じて取得できます。
ヒント
構造体タグは、 C#の属性に似ています。 C# では、クラス、フィールド、メソッドなどの前に属性を追加することができ、この属性システムはリフレクション システムで取得できます。例えば:
[Conditional(“DEBUG”)]
public static void Message(string msg)
{
Console.WriteLine(msg);
}
構造体タグの形式
構造体フィールドの後ろに記述されるタグの形式は次のとおりです。
`key1:”value1″ key2:”value2″`
構造体タグは 1 つ以上のキーと値のペアで構成されます。キーと値はコロンで区切られ、値は二重引用符で囲まれます。キーと値のペアはスペースで区切られます。
構造体タグから値を取得する
StructTag には、次のように、タグ情報を解析して抽出するためのメソッドがいくつかあります。
- func(tag StructTag) Get(キー文字列) string
- タグ内のキーに応じて対応する値を取得します。たとえば、`key1:”value1″key2:”value2″` のタグでは、「key1」を渡すと「value1」を取得できます。
- func(tag StructTag)Lookup(キー文字列)(値文字列,ok bool)
- Tagのキーに従って、値が存在するかどうかを問い合わせます。
タグを作成するときは、キーと値のペアの規則に厳密に従う必要があります。構造体タグの解析コードのエラー許容度は非常に低いです。形式が間違って記述されると、コンパイル中および実行時にエラーは表示されません。次の例を参照してください。
package main
import (
"fmt"
"reflect"
)
func main(){
type cat struct {
Name string
Type int `json:"type" id:"100"`
}
typeOfCat:= reflect.TypeOf(cat{})
catType、ok: = typeOfCat.FieldByName("Type"); ok {
fmt.Println(catType.Tag.Get("json"))
}
}
このコードは、予期される型ではなく空の文字列を出力します。
12 行目で、 json:
と"type"
の間にスペースを追加します。この書き方では構造体タグのルールに従わないため、Tag.Getでは正しいjson対応値を取得できません。
このエラーは開発中に非常に見落とされやすく、その結果、目に見えないエラーが発生します。