En la especificación de idioma de Go , menciona una breve descripción general de las etiquetas:
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. Las etiquetas se hacen visibles a través de una interfaz de reflexión, pero de lo contrario se ignoran.
// 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" }
Esta es una explicación muy breve de la OMI, y me preguntaba si alguien podría proporcionarme con qué uso serían estas etiquetas.
go
reflection
struct
liamzebedee
fuente
fuente
Respuestas:
Una etiqueta para un campo le permite adjuntar metainformación al campo que se puede adquirir mediante la reflexión. Por lo general, se usa para proporcionar información de transformación sobre cómo se codifica o descodifica un campo de estructura desde otro formato (o se almacena / recupera de una base de datos), pero puede usarlo para almacenar cualquier metainformación que desee, ya sea para otro paquete o para su propio uso.
Como se menciona en la documentación de
reflect.StructTag
, por convención, el valor de una cadena de etiqueta es una lista dekey:"value"
pares separados por espacios , por ejemplo:Por lo
key
general, denota el paquete para el que"value"
es posterior , por ejemplo, lasjson
claves son procesadas / utilizadas por elencoding/json
paquete.Si se va a pasar información múltiple en
"value"
, generalmente se especifica separándola con una coma (','
), p. Ej.Por lo general, un valor de guión (
'-'
) para los"value"
medios para excluir el campo del proceso (por ejemplo, en el caso dejson
que signifique no ordenar o desarmar ese campo).Ejemplo de acceso a sus etiquetas personalizadas mediante reflexión
Podemos usar la reflexión (
reflect
paquete) para acceder a los valores de etiqueta de los campos de estructura. Básicamente, necesitamos adquirir elType
de nuestra estructura, y luego podemos consultar los campos, por ejemplo, conType.Field(i int)
oType.FieldByName(name string)
. Estos métodos devuelven un valorStructField
que describe / representa un campo de estructura; yStructField.Tag
es un valor de tipoStructTag
que describe / representa un valor de etiqueta.Anteriormente hablamos de "convención" . Esta convención significa que si la sigue, puede usar el
StructTag.Get(key string)
método que analiza el valor de una etiqueta y le devuelve"value"
lakey
que especifique. La convención se implementa / integra en esteGet()
método. Si no sigue la convención,Get()
no podrá analizarkey:"value"
pares y encontrar lo que está buscando. Eso tampoco es un problema, pero luego debe implementar su propia lógica de análisis.También hay
StructTag.Lookup()
(se agregó en Go 1.7) que es "comoGet()
pero distingue la etiqueta que no contiene la clave dada de la etiqueta que asocia una cadena vacía con la clave dada" .Entonces veamos un ejemplo simple:
Salida (pruébalo en Go Playground ):
GopherCon 2015 tuvo una presentación sobre etiquetas de estructura llamada:
Las muchas caras de las etiquetas de estructura (diapositiva) (y un video )
Aquí hay una lista de claves de etiqueta comúnmente utilizadas:
json
- utilizado por elencoding/json
paquete, detallado enjson.Marshal()
xml
- utilizado por elencoding/xml
paquete, detallado enxml.Marshal()
bson
- utilizado por gobson , detallado enbson.Marshal()
protobuf
- utilizado 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
paquete; también utilizado porgithub.com/go-gorp/gorp
paqueteorm
- utilizado por elgithub.com/astaxie/beego/orm
paquete, detallado en Modelos - Beego ORMgorm
- utilizado por elgithub.com/jinzhu/gorm
paquete, se pueden encontrar ejemplos en su documento: Modelosvalid
- utilizado por elgithub.com/asaskevich/govalidator
paquete, se pueden encontrar ejemplos en la página del proyectodatastore
- utilizado porappengine/datastore
(plataforma Google App Engine, servicio Datastore), detallado en Propiedadesschema
- Utilizado porgithub.com/gorilla/schema
para llenar unstruct
formulario con valores HTML, detallado en el paquete doc.asn
- utilizado por elencoding/asn1
paquete, detallado enasn1.Marshal()
yasn1.Unmarshal()
csv
- utilizado por elgithub.com/gocarina/gocsv
paquetefuente
Aquí hay un ejemplo realmente simple de etiquetas que se usan con el
encoding/json
paquete para controlar cómo se interpretan los campos durante la codificación y decodificación:Probar en vivo: http://play.golang.org/p/BMeR8p1cKf
El paquete json puede mirar las etiquetas para el campo y se le puede decir cómo mapear el campo de estructura json <=>, y también opciones adicionales como si debe ignorar los campos vacíos cuando se serializa de nuevo a json.
Básicamente, cualquier paquete puede usar la reflexión en los campos para mirar los valores de las etiquetas y actuar sobre esos valores. Hay un poco más de información sobre ellos en el paquete
reflect http://golang.org/pkg/reflect/#StructTag :
fuente
Es una especie de especificaciones que especifica cómo se tratan los paquetes con un campo que está etiquetado.
por ejemplo:
La etiqueta json informa al
json
paquete que marcó la salida del siguiente usuariosería así:
otro ejemplo es
gorm
que las etiquetas de paquete declaran cómo deben realizarse las migraciones de la base de datos:En este ejemplo para el campo
Email
con etiqueta gorm declaramos que la columna correspondiente en la base de datos para el correo electrónico del campo debe ser de tipo varchar y 100 de longitud máxima y también debe tener un índice único.otro ejemplo son las
binding
etiquetas que se usan principalmente engin
paquetes.la etiqueta de enlace en este ejemplo da una pista al paquete gin de que los datos enviados a la API deben tener campos de usuario y contraseña porque estos campos están etiquetados según sea necesario.
Por lo general, las etiquetas son datos que los paquetes requieren para saber cómo deben tratarse con datos de diferentes tipos de estructuras y la mejor manera de familiarizarse con las etiquetas que necesita un paquete es LEER COMPLETAMENTE UNA DOCUMENTACIÓN DE PAQUETE.
fuente