Na especificação de idioma Go , ele menciona uma breve visão geral das tags:
Uma declaração de campo pode ser seguida por uma tag literal de cadeia opcional, que se torna um atributo para todos os campos na declaração de campo correspondente. As tags são visíveis por meio de uma interface de reflexão, mas são ignoradas.
// 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 é uma explicação muito curta da IMO, e eu queria saber se alguém poderia me fornecer qual o uso dessas tags.
go
reflection
struct
liamzebedee
fonte
fonte
Respostas:
Uma tag para um campo permite anexar meta-informações ao campo que pode ser adquirido usando reflexão. Geralmente, ele é usado para fornecer informações de transformação sobre como um campo de estrutura é codificado ou decodificado de outro formato (ou armazenado / recuperado de um banco de dados), mas você pode usá-lo para armazenar qualquer meta-informação que desejar, destinada a outra pacote ou para seu próprio uso.
Conforme mencionado na documentação de
reflect.StructTag
, por convenção, o valor de uma sequência de tags é uma lista dekey:"value"
pares separados por espaço , por exemplo:O
key
normalmente indica o pacote que o subsequente"value"
é de, por exemplo,json
as teclas são processados / utilizado peloencoding/json
pacote.Se várias informações devem ser passadas no
"value"
, normalmente elas são especificadas separando-as com uma vírgula (','
), por exemploGeralmente, um valor de hífen (
'-'
) para os"value"
meios de excluir o campo do processo (por exemplo, no caso dejson
isso significar não empacotar ou descompactar esse campo).Exemplo de acesso às suas tags personalizadas usando reflexão
Podemos usar a reflexão (
reflect
pacote) para acessar os valores das tags dos campos struct. Basicamente, precisamos adquirirType
nossa estrutura e, em seguida, podemos consultar os campos, por exemplo, comType.Field(i int)
ouType.FieldByName(name string)
. Esses métodos retornam um valorStructField
que descreve / representa um campo struct; eStructField.Tag
é um valor do tipoStructTag
que descreve / representa um valor de tag.Anteriormente, conversamos sobre "convenção" . Essa convenção significa que, se você a seguir, poderá usar o
StructTag.Get(key string)
método que analisa o valor de uma tag e retorna"value"
o quekey
você especificar. A convenção é implementada / incorporada a esteGet()
método. Se você não seguir a convenção,Get()
não poderá analisarkey:"value"
pares e encontrar o que está procurando. Isso também não é um problema, mas você precisa implementar sua própria lógica de análise.Também existe
StructTag.Lookup()
(foi adicionado no Go 1.7) que é "semelhante,Get()
mas distingue, a marca que não contém a chave especificada da marca que associa uma cadeia vazia à chave especificada" .Então, vamos ver um exemplo simples:
Saída (experimente no Go Playground ):
O GopherCon 2015 teve uma apresentação sobre tags struct chamada:
As muitas faces das tags Struct (slide) (e um vídeo )
Aqui está uma lista das chaves de tag mais usadas:
json
- usado pelaencoding/json
embalagem, detalhado emjson.Marshal()
xml
- usado pelaencoding/xml
embalagem, detalhado emxml.Marshal()
bson
- usado por gobson , detalhado embson.Marshal()
protobuf
- usado porgithub.com/golang/protobuf/proto
, detalhado no pacote docyaml
- usado pelagopkg.in/yaml.v2
embalagem, detalhado emyaml.Marshal()
db
- usado pelagithub.com/jmoiron/sqlx
embalagem; também usado pelogithub.com/go-gorp/gorp
pacoteorm
- usado pelogithub.com/astaxie/beego/orm
pacote, detalhado em Modelos - Beego ORMgorm
- usado pelogithub.com/jinzhu/gorm
pacote, exemplos podem ser encontrados em seus documentos: Modelosvalid
- usado pelogithub.com/asaskevich/govalidator
pacote, exemplos podem ser encontrados na página do projetodatastore
- usado porappengine/datastore
(plataforma Google App Engine, serviço Datastore), detalhado em Propriedadesschema
- usado porgithub.com/gorilla/schema
para preencher umstruct
com valores de formulário HTML, detalhados no documento do pacoteasn
- usado pelaencoding/asn1
embalagem, detalhado emasn1.Marshal()
easn1.Unmarshal()
csv
- usado pelagithub.com/gocarina/gocsv
embalagemfonte
Aqui está um exemplo muito simples de tags sendo usadas com o
encoding/json
pacote para controlar como os campos são interpretados durante a codificação e decodificação:Experimente ao vivo: http://play.golang.org/p/BMeR8p1cKf
O pacote json pode examinar as tags do campo e saber como mapear o campo json <=> struct, além de opções extras como se deve ignorar os campos vazios ao serializar de volta ao json.
Basicamente, qualquer pacote pode usar a reflexão nos campos para examinar os valores dos tags e agir sobre esses valores. Há um pouco mais de informações sobre eles no pacote de reflexão
http://golang.org/pkg/reflect/#StructTag :
fonte
É algum tipo de especificação que especifica como os pacotes são tratados com um campo que está marcado.
por exemplo:
A tag json informa o
json
pacote que organizou a saída do seguinte usuárioseria assim:
outro exemplo é as
gorm
tags de pacote que declaram como as migrações do banco de dados devem ser feitas:Neste exemplo para o campo
Email
com tag gorm, declaramos que a coluna correspondente no banco de dados para o email do campo deve ser do tipo varchar e 100 de comprimento máximo e também deve ter um índice exclusivo.outro exemplo são as
binding
tags usadas principalmente nogin
pacote.a tag de ligação neste exemplo dá uma dica ao pacote gin de que os dados enviados à API devem ter campos de usuário e senha, pois esses campos são marcados conforme necessário.
Portanto, tags geralmente são dados que os pacotes precisam saber como devem ser tratados com dados de estruturas diferentes e a melhor maneira de se familiarizar com as tags de que um pacote precisa é LER UMA DOCUMENTAÇÃO DE PACOTE COMPLETAMENTE.
fonte