構造体のメンバ情報をreflect.Typeで取得するreflect.StructField構造体のタグを構造体タグ(Structタグ)と呼びます。構造体タグは、構造体フィールドの追加情報タグです。

 

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対応値を取得できません。

このエラーは開発中に非常に見落とされやすく、その結果、目に見えないエラーが発生します。

 

「 Go言語の構造タグ(Structタグ)」についてわかりやすく解説!絶対に観るべきベスト2動画

【Go言語 超入門コース】04.プログラムの3つの基本構造|プログラムの動きはシンプル。動きは3つだけ【プログラミング初心者向け入門講座】
Go言語とは?|プログラミング言語のGo言語について3分でわかりやすく解説します【プログラミング初心者向け】

Share via
Copy link