Solución:
tl; dr: Usar ,omitempty
, y si necesita preocuparse por la diferencia entre un valor cero y nulo / no especificado, haga lo que hace la API de GitHub y use un puntero.
Ambos json
y bson
apoyen el ,omitempty
etiqueta. Para json, “los valores vacíos son falsos, 0, cualquier puntero nulo o valor de interfaz, y cualquier matriz, sector, mapa, o cuerda de longitud cero “(json docs). Para bson, ,omitempty
significa “Incluir el campo solo si no está establecido en el valor cero para el tipo o en sectores o mapas vacíos”, y los valores cero incluyen cadenas vacías y punteros nulos (bson docs).
Entonces, si realmente necesita una estructura de grupo, puede poner una *Group
en su lugar, y no se almacenará cuando el puntero sea nulo. Si Investment
solo necesita sostener el grupo nombre, es aún más simple: ""
ya que el nombre del grupo evita que se almacene una clave de grupo.
bson
por defecto ya usa el nombre del campo en minúsculas para que pueda omitirlo de la etiqueta struct cuando coincidan. json
por defecto, el nombre en mayúsculas, así que especifique el nombre en minúsculas en una etiqueta si necesita minúsculas.
Entonces, en el mejor de los casos, tal vez puedas usar:
type Investment struct {
Base
Symbol string `json:"symbol" binding:"required"`
Group string `json:"group,omitempty" bson:",omitempty"`
Fields bson.M `json:"fields"`
}
Si alguna vez se encuentra con campos donde el valor cero para el tipo (“”, 0, falso, etc.) es distinto de “no especificado”, puede hacer lo que hace la API de GitHub y poner punteros en sus estructuras, esencialmente un extensión de la *Group
truco.