Dans la spécification de langue Go , il mentionne un bref aperçu des balises:
Une déclaration de champ peut être suivie d'une balise littérale de chaîne facultative, qui devient un attribut pour tous les champs de la déclaration de champ correspondante. Les balises sont rendues visibles à travers une interface de réflexion mais sont sinon ignorées.
// A struct corresponding to the TimeStamp protocol buffer. // The tag strings define the protocol buffer field numbers. struct { microsec uint64 "field 1" serverIP6 uint64 "field 2" process string "field 3" }
Ceci est une très courte explication OMI, et je me demandais si quelqu'un pourrait me fournir à quoi serviraient ces balises?
go
reflection
struct
liamzebedee
la source
la source
Réponses:
Une balise pour un champ vous permet d'attacher des méta-informations au champ qui peuvent être acquises par réflexion. Habituellement, il est utilisé pour fournir des informations de transformation sur la façon dont un champ struct est codé ou décodé à partir d'un autre format (ou stocké / récupéré à partir d'une base de données), mais vous pouvez l'utiliser pour stocker les méta-informations que vous souhaitez, destinées à un autre paquet ou pour votre propre usage.
Comme mentionné dans la documentation de
reflect.StructTag
, par convention, la valeur d'une chaîne de balises est une liste dekey:"value"
paires séparées par des espaces , par exemple:le
key
désigne généralement le package pour lequel le suivant"value"
est destiné, par exemple lesjson
clés sont traitées / utilisées par leencoding/json
package.Si plusieurs informations doivent être transmises dans le
"value"
, elles sont généralement spécifiées en les séparant par une virgule (','
), par exempleHabituellement, une valeur de tiret (
'-'
) pour les"value"
moyens d'exclure le champ du processus (par exemple, dans le cas oùjson
cela signifie de ne pas marshaler ou démarsaler ce champ).Exemple d'accès à vos balises personnalisées à l'aide de la réflexion
Nous pouvons utiliser la réflexion (
reflect
package) pour accéder aux valeurs des balises des champs struct. Fondamentalement, nous devons acquérir leType
de notre structure, puis nous pouvons interroger des champs, par exemple avecType.Field(i int)
ouType.FieldByName(name string)
. Ces méthodes renvoient une valeurStructField
qui décrit / représente un champ struct; etStructField.Tag
est une valeur de typeStructTag
qui décrit / représente une valeur de balise.Auparavant, nous parlions de «convention» . Ce moyen de la convention que si vous le suivez, vous pouvez utiliser la
StructTag.Get(key string)
méthode qui analyse la valeur d'une variable et vous renvoie le"value"
dekey
vous spécifiez. La convention est implémentée / intégrée dans cetteGet()
méthode. Si vous ne respectez pas la convention, vousGet()
ne pourrez pas analyser leskey:"value"
paires et trouver ce que vous cherchez. Ce n'est pas non plus un problème, mais vous devez ensuite implémenter votre propre logique d'analyse.Il y a aussi
StructTag.Lookup()
(a été ajouté dans Go 1.7) qui est "similaireGet()
mais distingue la balise ne contenant pas la clé donnée de la balise associant une chaîne vide à la clé donnée" .Voyons donc un exemple simple:
Sortie (essayez-la sur le Go Playground ):
GopherCon 2015 avait une présentation sur les balises struct appelée:
Les nombreux visages des balises Struct (diapositive) (et une vidéo )
Voici une liste des clés de balise couramment utilisées:
json
- utilisé par leencoding/json
package, détaillé àjson.Marshal()
xml
- utilisé par leencoding/xml
package, détaillé àxml.Marshal()
bson
- utilisé par gobson , détaillé àbson.Marshal()
protobuf
- utilisé pargithub.com/golang/protobuf/proto
, détaillé dans le paquet docyaml
- utilisé par legopkg.in/yaml.v2
package, détaillé àyaml.Marshal()
db
- utilisé par legithub.com/jmoiron/sqlx
package; également utilisé pargithub.com/go-gorp/gorp
packageorm
- utilisé par legithub.com/astaxie/beego/orm
package, détaillé sur les modèles - Beego ORMgorm
- utilisé par legithub.com/jinzhu/gorm
package, des exemples peuvent être trouvés dans leur doc: Modèlesvalid
- utilisé par legithub.com/asaskevich/govalidator
package, des exemples peuvent être trouvés dans la page du projetdatastore
- utilisé parappengine/datastore
(plate-forme Google App Engine, service Datastore), détaillé à Propriétésschema
- utilisé pargithub.com/gorilla/schema
pour remplir unstruct
avec des valeurs de formulaire HTML, détaillées dans le paquet docasn
- utilisé par leencoding/asn1
package, détaillé àasn1.Marshal()
etasn1.Unmarshal()
csv
- utilisé par legithub.com/gocarina/gocsv
packagela source
Voici un exemple très simple de balises utilisées avec le
encoding/json
package pour contrôler la façon dont les champs sont interprétés pendant l'encodage et le décodage:Essayez en direct: http://play.golang.org/p/BMeR8p1cKf
Le package json peut regarder les balises du champ et savoir comment mapper le champ struct json <=>, ainsi que des options supplémentaires comme s'il doit ignorer les champs vides lors de la sérialisation vers json.
Fondamentalement, tout package peut utiliser la réflexion sur les champs pour examiner les valeurs des balises et agir sur ces valeurs. Il y a un peu plus d'informations à leur sujet dans le package Reflect
http://golang.org/pkg/reflect/#StructTag :
la source
C'est une sorte de spécifications qui spécifie comment les packages sont traités avec un champ balisé.
par exemple:
La balise json informe le
json
package que la sortie a été gérée par l'utilisateur suivantserait comme ça:
un autre exemple est
gorm
les balises de package déclarent comment les migrations de base de données doivent être effectuées:Dans cet exemple pour le champ
Email
avec la balise gorm, nous déclarons que la colonne correspondante dans la base de données pour le champ e-mail doit être de type varchar et 100 de longueur maximale et doit également avoir un index unique.un autre exemple est les
binding
balises qui sont utilisées très majoritairement dans lesgin
packages.la balise de liaison dans cet exemple indique au package gin que les données envoyées à l'API doivent avoir des champs d'utilisateur et de mot de passe car ces champs sont balisés comme requis.
Les balises générales sont donc des données dont les packages ont besoin pour savoir comment traiter les données avec des structures de type différent et la meilleure façon de se familiariser avec les balises dont un package a besoin est de LIRE UNE DOCUMENTATION COMPLÈTE COMPLÈTEMENT.
la source