Go Tags expliqué

Comment les balises peuvent ajouter des méta-informations aux structures et comment vous pouvez en tirer parti

Les balises sont un moyen d'attacher des informations supplémentaires à un champ struct.

La spécification Go dans leDéfinition des types de structuredéfinit les balises comme

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. Une chaîne de balise vide équivaut à une balise absente. Les balises sont rendues visibles via une interface de réflexion et participent à l'identité de type pour les structures, mais sont sinon ignorées.

et donne un exemple:

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" }

Un exemple concret

Un cas d'utilisation courant pour cela est celui de la démarshaling de JSON, comme je l'explique dansTraitement JSON avec Go.

Dans cet article, l'exemple

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

racontejson.Unmarshal()mettre leagePropriété JSON, unestring, et mettez-le dans leAgedomaine deMember, se traduisant par unint. Dans cet exemple, nous passonsjsondeux informations, séparées par une virgule.

Format des balises

Les balises utilisent lekey:"value"format. Ce n'est pas une règle stricte, mais une convention, qui fournit une analyse intégrée. Dans cet exemple, nous n'avons qu'une seule paire clé-valeur, mais nous pourrions en avoir plusieurs:

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

La clé par convention est le nom du package que nous voulons cibler. Dans l'exemple ci-dessus,encoding/jsonetencoding/xml.

Mais les balises peuvent également être utilisées par nous-mêmes dans nos propres bibliothèques, elles ne sont pas uniquement réservées à la bibliothèque standard.

À quoi servent les balises?

Différents packages utilisent des balises pour différentes raisons.

Vous les verrez utilisés dans l'encodage des bibliothèques, comme json, xml, bson, yaml, mais aussi dans les bibliothèques ORM / base de données, et mêmeremplir une structure avec des données de formulaire.

La liste suivante a été publiée surALORSet est assez complet:

Il existe de nombreux autres usages dans la nature. Par exemplemcuadros / go-defaultsutilisez-le pour définir les valeurs par défaut des champs de structure, etasaskevich / govalidatorpermet d'ajouter des balises qui déterminent la validation (ce n'est qu'une manière possible de valider,des alternatives existent).

fatih / gomodifytagspermet d'éditer les balises lors de l'exécution,

Utiliser des balises dans votre code

Pour utiliser des balises dans votre propre code, vous pouvez utiliser lereflectpaquet.

Essayons d'obteniragedans une structure Member. Le code suivant

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”)) }

jouer

va imprimerage, grâce au respect de lakey:"value"format pour notre balise.


Plus de tutoriels go: