Golang の
Tag は、シリアル化、逆シリアル化、ORM マッピング、その他のシナリオに使用できる構造フィールドのメタ情報を提供できます。実際のプロジェクトでは要件が変更された場合、タグ内のキー値を変更する必要がある場合がありますので、この記事ではタグの変更方法を紹介します。
Golang のタグは、構造フィールドの型の後に記述され、型定義の一部であるため、不変です。 , その後、この型の定義も変更され、Go の型安全性が損なわれます。
タグは不変なので、タグを変更するにはどうすればよいでしょうか?実際、それは反省を通じて達成できます。
次の構造定義があるとします。
type User struct { Id int64 `json:"user_id" db:"id"` Username string `json:"-" db:"username"` Password string `json:"-" db:"password"` }
次に、タグ内の db を db_new に変更します。これは、次の方法で実現できます。
reflect.StructTag(`json:"user_id" db_new:"id"`).Get("db")
の は文字列を構造体タグ型に変換し、
.Get() メソッドは構造体タグ内の指定されたキーの値を取得できます。
package main import ( "fmt" "reflect" ) func main() { type User struct { Id int64 `json:"user_id" db:"id"` Username string `json:"-" db:"username"` Password string `json:"-" db:"password"` } user := User{Id: 1, Username: "foo", Password: "bar"} field := reflect.TypeOf(user).Field(0) tag := field.Tag fmt.Println(tag.Get("db")) newTag := reflect.StructTag(`json:"user_id" db_new:"id"`) newField := reflect.StructField{ Name: field.Name, Type: field.Type, Tag: newTag, Anonymous: field.Anonymous, } newType := reflect.StructOf([]reflect.StructField{newField}) newUser := reflect.New(newType).Elem() newUser.Field(0).SetInt(user.Id) newTagValue := newUser.Type().Field(0).Tag.Get("db_new") fmt.Println(newTagValue) }
Id のタグを取得し、そのタグを出力します。デシベル値。次に、
reflect.StructTag() メソッドを使用して、文字列
json:"user_id" db_new:"id" を構造体タグ タイプに変換します。
reflect.StructField{} を使用して新しい構造フィールドを作成し、新しいタグ値と、フィールド名、タイプ、フィールドかどうかなどの元のフィールドの属性を指定します。匿名等です。次に、
reflect.StructOf() を使用して、新しい構造体型を作成します。
reflect.New() を使用して新しい構造体インスタンスを作成し、元の構造体インスタンスの Id フィールドの値を新しいインスタンスにコピーし、
reflect を使用します。 .Type().Field(0).Tag.Get() 新しいインスタンスの db_new 値を取得します。
id db_new:"id"
以上がgolangでタグを変更する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。