golangでタグを変更する方法

PHPz
リリース: 2023-04-06 09:40:42
オリジナル
1180 人が閲覧しました

Golang の

Tag は、シリアル化、逆シリアル化、ORM マッピング、その他のシナリオに使用できる構造フィールドのメタ情報を提供できます。実際のプロジェクトでは要件が変更された場合、タグ内のキー値を変更する必要がある場合がありますので、この記事ではタグの変更方法を紹介します。

1. 不変性

Golang のタグは、構造フィールドの型の後に記述され、型定義の一部であるため、不変です。 , その後、この型の定義も変更され、Go の型安全性が損なわれます。

2. 解決策

タグは不変なので、タグを変更するにはどうすればよいでしょうか?実際、それは反省を通じて達成できます。

次の構造定義があるとします。

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")
ログイン後にコピー
##コード #reflect.StructTag()

は文字列を構造体タグ型に変換し、.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"
ログイン後にコピー
3. 注意事項

実際の開発でタグを変更する場合は、次の点に注意する必要があります。

# #新しい構造タイプはリフレクションを通じて作成する必要があります。タグを直接変更する場合と比較すると、追加のパフォーマンス オーバーヘッドが発生します。
  • タグ値を変更すると、元の ORM マッピングが影響を受ける可能性がありますタグの値を変更しても他の機能が誤動作しないことを確認する必要があります;
  • タグは key:value の形式で複数のキー値を指定できるため、変更する場合は特別な注意が必要です。
  • 4. まとめ

以上はGolangでタグを変更する方法と注意点です。一般に、絶対に必要な場合を除き、タグを変更することはお勧めできません。実際のプロジェクトでは、元のタグの不変性を維持しながら、要件の変化のニーズを満たすために新しいタグを追加できます。

以上がgolangでタグを変更する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート