Maison >développement back-end >Golang >Comment modifier la balise dans Golang
Tag in Golang peut fournir des méta-informations pour les champs de structure, qui peuvent être utilisées pour la sérialisation, la désérialisation, le mappage ORM et d'autres scénarios. Dans les projets réels, lorsque les exigences changent, vous devrez peut-être modifier la valeur clé dans la balise. Cet article explique comment modifier la balise.
La balise dans Golang est immuable, car la balise est écrite après le type du champ de structure et fait partie de la définition du type. Si la balise peut être modifiée à volonté, alors la définition de ce type le sera. changer également, ce qui briserait la sécurité du type de Go.
Puisque la balise est immuable, comment la modifier ? En fait, cela peut être réalisé grâce à la réflexion.
Supposons qu'il existe la définition de structure suivante :
type User struct { Id int64 `json:"user_id" db:"id"` Username string `json:"-" db:"username"` Password string `json:"-" db:"password"` }
Maintenant, nous voulons changer la balise db in en db_new, ce qui peut être réalisé par la méthode suivante :
reflect.StructTag(`json:"user_id" db_new:"id"`).Get("db")
Le reflect.StructTag()
dans le code est La chaîne est convertie en type de balise de structure et la méthode .Get()
peut obtenir la valeur de la clé spécifiée dans la balise de structure. reflect.StructTag()
是将字符串转换为结构体 tag 类型,.Get()
方法可以获取结构体 tag 中指定键的值。
下面看一下完整的修改 tag 的代码:
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
的 tag,输出它的 db 值。然后使用 reflect.StructTag()
方法将字符串 json:"user_id" db_new:"id"
转换为结构体 tag 类型。
接着,我们使用 reflect.StructField{}
创建新的结构体字段,指定新的 tag 值,以及原始字段的一些属性,比如字段名、类型、是否匿名等。然后使用 reflect.StructOf()
创建一个新的结构体类型。
最后,我们使用 reflect.New()
创建一个新的结构体实例,将原来结构体实例中的 Id 字段的值复制到新的实例中,使用 reflect.Type().Field(0).Tag.Get()
id db_new:"id"Dans le code ci-dessus, nous obtenons d'abord la balise du champ de structure
Id
et sortons sa valeur de base de données. Utilisez ensuite la méthode reflect.StructTag()
pour convertir la chaîne json:"user_id" db_new:"id"
en type de balise de structure. Ensuite, nous utilisons reflect.StructField{}
pour créer un nouveau champ de structure, spécifier la nouvelle valeur de la balise et certains attributs du champ d'origine, tels que le nom du champ, le type, s'il est anonyme. , etc. Utilisez ensuite reflect.StructOf()
pour créer un nouveau type de structure. Enfin, nous utilisons reflect.New()
pour créer une nouvelle instance de structure, copions la valeur du champ Id dans l'instance de structure d'origine dans la nouvelle instance et utilisons reflect. ().Field(0).Tag.Get()
Obtient la valeur db_new dans la nouvelle instance. Après la modification de la valeur de la balise, le mappage ORM d'origine peut être affecté, vous devez donc vous assurer que la modification de la valeur de la balise n'entraînera pas de dysfonctionnement d'autres fonctions
🎜la balise ; être spécifié sous la forme de clé:valeur Plusieurs valeurs de clé nécessitent une attention particulière lors de leur modification. 🎜🎜🎜4. Résumé🎜🎜Ci-dessus sont les méthodes et précautions pour modifier les balises dans Golang. D’une manière générale, il n’est pas recommandé de modifier les balises sauf en cas d’absolue nécessité. Dans les projets réels, vous pouvez ajouter une nouvelle balise pour répondre aux besoins changeants des exigences tout en conservant l'invariance de la balise d'origine. 🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!