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
keygeneral, denota el paquete para el que"value"es posterior , por ejemplo, lasjsonclaves son procesadas / utilizadas por elencoding/jsonpaquete.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 dejsonque signifique no ordenar o desarmar ese campo).Ejemplo de acceso a sus etiquetas personalizadas mediante reflexión
Podemos usar la reflexión (
reflectpaquete) para acceder a los valores de etiqueta de los campos de estructura. Básicamente, necesitamos adquirir elTypede nuestra estructura, y luego podemos consultar los campos, por ejemplo, conType.Field(i int)oType.FieldByName(name string). Estos métodos devuelven un valorStructFieldque describe / representa un campo de estructura; yStructField.Tages un valor de tipoStructTagque 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"lakeyque 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/jsonpaquete, detallado enjson.Marshal()xml- utilizado por elencoding/xmlpaquete, 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.v2paquete, detallado enyaml.Marshal()db- utilizado por elgithub.com/jmoiron/sqlxpaquete; también utilizado porgithub.com/go-gorp/gorppaqueteorm- utilizado por elgithub.com/astaxie/beego/ormpaquete, detallado en Modelos - Beego ORMgorm- utilizado por elgithub.com/jinzhu/gormpaquete, se pueden encontrar ejemplos en su documento: Modelosvalid- utilizado por elgithub.com/asaskevich/govalidatorpaquete, 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/schemapara llenar unstructformulario con valores HTML, detallado en el paquete doc.asn- utilizado por elencoding/asn1paquete, detallado enasn1.Marshal()yasn1.Unmarshal()csv- utilizado por elgithub.com/gocarina/gocsvpaquetefuente
Aquí hay un ejemplo realmente simple de etiquetas que se usan con el
encoding/jsonpaquete 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
jsonpaquete que marcó la salida del siguiente usuariosería así:
otro ejemplo es
gormque las etiquetas de paquete declaran cómo deben realizarse las migraciones de la base de datos:En este ejemplo para el campo
Emailcon 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
bindingetiquetas que se usan principalmente enginpaquetes.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