Cómo las etiquetas pueden agregar metainformación a las estructuras y cómo puede aprovecharlas
Las etiquetas son una forma de adjuntar información adicional a un campo de estructura.
La especificación Go en elDefinición de tipos de estructurasdefine etiquetas como
Una declaración de campo puede ir seguida de una etiqueta literal de cadena opcional, que se convierte en un atributo para todos los campos en la declaración de campo correspondiente. Una cadena de etiquetas vacía es equivalente a una etiqueta ausente. Las etiquetas se hacen visibles a través de una interfaz de reflexión y participan en la identidad de tipo para estructuras, pero de lo contrario se ignoran.
y proporciona un ejemplo:
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 ejemplo del mundo real
Un caso de uso común para esto es al desagrupar JSON, como explico enProcesamiento JSON con Go.
En esa publicación, el ejemplo
type Member struct {
Age int `json:"age,string"`
}
dicejson.Unmarshal()
poner elage
Propiedad JSON, astring
y ponerlo en elAge
campo deMember
, traduciendo a unint
. En este ejemplo, pasamosjson
dos informaciones, separadas por una coma.
Formato de etiquetas
Las etiquetas usan elkey:"value"
formato. No es una regla estricta, sino una convención, que proporciona análisis integrado. En ese ejemplo, solo tenemos un par clave-valor, pero podríamos tener más de uno:
type Member struct {
Age int `json:"age,string" xml:"the_age,string"`
}
La clave por convención es el nombre del paquete al que queremos apuntar. En el ejemplo anterior,encoding/json
yencoding/xml
.
Pero las etiquetas también las podemos usar nosotros mismos en nuestras propias bibliotecas, no solo están reservadas para la biblioteca estándar.
¿Para qué se utilizan las etiquetas?
Los diferentes paquetes usan etiquetas por diferentes razones.
Los verá utilizados en la codificación de bibliotecas, como json, xml, bson, yaml, pero también en bibliotecas de base de datos / ORM, e inclusollenar una estructura con datos de formulario.
La siguiente lista fue publicada enASI QUEy es bastante completo:
json
- utilizado por elencoding/json
paquete, detallado enjson.Marshal()
xml
- utilizado por elencoding/xml
paquete, detallado enxml.Marshal()
bson
- usado porgobson, detallado enbson.Marshal()
protobuf
- usado porgithub.com/golang/protobuf/proto
, detallado en el paquete docyaml
- utilizado por elgopkg.in/yaml.v2
paquete, detallado enyaml.Marshal()
db
- utilizado por elgithub.com/jmoiron/sqlx
paqueteorm
- utilizado por elgithub.com/astaxie/beego/orm
paquete, detallado enModelos - Beego ORMgorm
- utilizado por elgithub.com/jinzhu/gorm
paquete, se pueden encontrar ejemplos en su documento:Modelosdatastore
- usado porappengine/datastore
(Plataforma Google App Engine, servicio Datastore), detallado enPropiedadesschema
- usado porgithub.com/gorilla/schema
para llenar unstruct
con valores de formulario HTML, detallados en el documento del paqueteasn
- utilizado por elencoding/asn1
paquete, detallado enasn1.Marshal()
yasn1.Unmarshal()
Hay muchos otros usos en la naturaleza. Por ejemplomcuadros / go-defaultsuse s it para establecer valores predeterminados para campos de estructura, yasaskevich / govalidatorpermite agregar etiquetas que determinan la validación (esa es solo una forma posible de validar,existen alternativas).
fatih / gomodifytagspermite editar etiquetas en tiempo de ejecución,
Usando etiquetas en su código
Para usar etiquetas en su propio código, puede usar elreflect
paquete.
Intentemos conseguirage
en una estructura miembro. El siguiente código
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”))
}
imprimiráage
, gracias a la adhesión a lakey:"value"
formato para nuestra etiqueta.
Más tutoriales de go:
- Uso de NGINX Reverse Proxy para brindar servicios de Go
- Hacer una copia de una estructura en Go
- Los conceptos básicos de un servidor web Go
- Ordenar un tipo de mapa en Go
- Ir consejos en pocas palabras
- Explicación de las etiquetas Go
- Ir al formato de fecha y hora
- Procesamiento JSON con Go
- Ir a funciones variadas
- Hoja de referencia de Go Strings
- Explicación de la interfaz Go Empty
- Depuración de Go con VS Code y Delve
- Parámetros de devoluciones de Go Named
- Generación de cadenas y números aleatorios en Go
- Estructura del sistema de archivos de un proyecto de Go
- Algoritmo de búsqueda binaria implementado en Go
- Uso de indicadores de línea de comando en Go
- GOPATH explicado
- Cree una aplicación de línea de comandos con Go: lolcat
- Construyendo un comando CLI con Go: cowsay
- Uso de Shell Pipes con Go
- Tutorial de Go CLI: clon de la fortuna
- Enumere los archivos en una carpeta con Go
- Use Ir para obtener una lista de repositorios de GitHub
- Ve, agrega un trozo de cadenas a un archivo
- Ve, convierte una cadena en un segmento de bytes
- Visualice sus contribuciones locales de Git con Go
- Introducción a la creación de perfiles de memoria y CPU de Go
- Resolver el error "no admite la indexación" en un programa Go
- Medir el tiempo de ejecución en un programa Go
- Creación de un rastreador web con Go para detectar títulos duplicados
- Siga las mejores prácticas: ¿puntero o receptores de valor?
- Siga las mejores prácticas: ¿Debería utilizar un método o una función?
- Ir a estructuras de datos: Establecer
- Hoja de referencia de Go Maps
- Genere implementaciones para tipos genéricos en Go
- Ir a estructuras de datos: diccionario
- Ir a estructuras de datos: tabla hash
- Implementar oyentes de eventos en canales de paso
- Ir a estructuras de datos: apilar
- Ir a estructuras de datos: cola
- Ir a estructuras de datos: árbol de búsqueda binaria
- Ir a estructuras de datos: gráfico
- Ir a estructuras de datos: lista vinculada
- La guía completa de Go Data Structures
- Comparación de valores de Go
- ¿Go está orientado a objetos?
- Trabajar con una base de datos SQL en Go
- Usar variables de entorno en Go
- Ir al tutorial: API REST respaldada por PostgreSQL
- Habilitación de CORS en un servidor web Go
- Implementación de una aplicación Go en un contenedor Docker
- Por qué Go es un lenguaje poderoso para aprender como desarrollador PHP
- Ve, elimina el carácter de nueva línea io.Reader.ReadString
- Ir, cómo ver los cambios y reconstruir su programa
- Ve, cuenta los meses desde una fecha
- Acceder a los parámetros HTTP POST en Go