タグの説明に行く

タグが構造体にメタ情報を追加する方法と、それを活用する方法

タグは、構造体フィールドに追加情報を添付する方法です。

のGo仕様構造体タイプの定義タグを次のように定義します

フィールド宣言の後には、オプションの文字列リテラルタグを続けることができます。これは、対応するフィールド宣言のすべてのフィールドの属性になります。空のタグ文字列は、タグがないことと同じです。タグはリフレクションインターフェイスを介して表示され、構造体のタイプIDに参加しますが、それ以外の場合は無視されます。

例を示します。

struct {
    x, y float64 ""  // an empty tag string is like an absent tag
    name string  "any string is permitted as a tag"
    _    [4]byte "ceci n'est pas un champ de structure"
}

// A struct corresponding to a TimeStamp protocol buffer. // The tag strings define the protocol buffer field numbers; // they follow the convention outlined by the reflect package. struct { microsec uint64 protobuf:"1" serverIP6 uint64 protobuf:"2" }

実際の例

これの一般的なユースケースは、JSONをアンマーシャリングする場合です。Goを使用したJSON処理

その投稿では、例

type Member struct {
    Age       int `json:"age,string"`
}

言うjson.Unmarshal()置くためにageJSONプロパティ、string、そしてそれをAgeの分野Member、に翻訳するint。この例では、jsonカンマで区切られた2つの情報。

タグのフォーマット

タグはkey:"value"フォーマット。これは厳密な規則ではなく、組み込みの構文解析を提供する規則です。この例では、キーと値のペアは1つしかありませんが、複数持つことができます。

type Member struct {
    Age       int `json:"age,string" xml:"the_age,string"`
}

慣例によるキーは、ターゲットにするパッケージの名前です。上記の例では、encoding/jsonそしてencoding/xml

ただし、タグは、標準ライブラリ用に予約されているだけでなく、独自のライブラリでも使用できます。

タグは何に使用されますか?

さまざまなパッケージがさまざまな理由でタグを使用します。

json、xml、bson、yamlなどのライブラリのエンコードだけでなく、ORM /データベースライブラリ、さらにはそれらが使用されていることがわかります。構造体にフォームデータを入力する

以下のリストが投稿されましたそうそして非常に包括的です:

野生では他にも多くの使用法があります。例えばmcuadros / go-defaultss itを使用して、構造体フィールドのデフォルト値を設定し、asaskevich / govalidator検証を決定するタグを追加できます(これは検証の1つの可能な方法にすぎません。代替案が存在します)。

fatih / gomodifytags実行時にタグを編集できます。

コードでタグを使用する

独自のコードでタグを使用するには、reflectパッケージ

取得してみましょうageメンバー構造体で。次のコード

package main

import ( “fmt” “reflect” )

type Member struct { Age int something:"age" }

func main() { member := Member{34} t := reflect.TypeOf(member) field := t.Field(0) //field, _ := t.FieldByName(“Age”) //alternative fmt.Print(field.Tag.Get(“something”)) }

演奏する

印刷しますage、に固執してくれてありがとうkey:"value"タグのフォーマット。


その他のチュートリアル: