Como definir várias tags de nome em uma estrutura


137

Eu preciso obter um item de um banco de dados mongo, então eu defini uma estrutura como esta

type Page struct {
    PageId string                 `bson:"pageId"`
    Meta   map[string]interface{} `bson:"meta"`
}

Agora também preciso codificá-lo para JSON, mas ele codifica os campos em maiúsculas (eu recebo PageId em vez de pageId), então também preciso definir tags de campo para JSON. Eu tentei algo assim, mas não funcionou:

type Page struct {
    PageId string                 `bson:"pageId",json:"pageId"`
    Meta   map[string]interface{} `bson:"meta",json:"pageId"`
}

Então, como isso pode ser feito, defina várias tags de nome em uma estrutura?

Respostas:


238

Diz na documentação do reflectpacote:

Por convenção, as seqüências de tags são uma concatenação de pares de chave opcionalmente separados por espaço: "valor". Cada chave é uma string não vazia que consiste em caracteres não de controle que não sejam espaço (U + 0020 ''), aspas (U + 0022 '"') e dois pontos (U + 003A ':'). Cada valor é citado usando caracteres U + 0022 '"' e sintaxe literal da string Go.

O que você precisa fazer é usar espaço em vez de vírgula como separador de sequência de tags.

type Page struct {
    PageId string                 `bson:"pageId" json:"pageId"`
    Meta   map[string]interface{} `bson:"meta" json:"meta"`
}

5
Além disso, verifique se ele está separado apenas por um espaço, não por uma guia. cf. stackoverflow.com/questions/20215510/...
GreenRaccoon23

68

Obrigado pela resposta aceita.

Abaixo está apenas para pessoas preguiçosas como eu.

INCORRETA

type Page struct {
    PageId string                 `bson:"pageId",json:"pageId"`
    Meta   map[string]interface{} `bson:"meta",json:"pageId"`
}

CORRIGIR

type Page struct {
    PageId string                 `bson:"pageId" json:"pageId"`
    Meta   map[string]interface{} `bson:"meta" json:"pageId"`
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.