gopkg - mgo mongodb driver
Campos de estructura vacĂos o no requeridos en Golang (1)
Soy algo nuevo en lenguajes escritos como Go y estoy tratando de aprender las mejores maneras de implementar cosas.
Tengo dos estructuras que representan modelos que se insertarán en una base de datos mongodb. Una estructura (Inversión) tiene la otra estructura (Grupo) como uno de sus campos.
type Group struct {
Base
Name string `json:"name" bson"name"`
}
type Investment struct {
Base
Symbol string `json:"symbol" bson:"symbol" binding:"required"`
Group Group `json:"group" bson:"group"`
Fields bson.M `json:"fields" bson:"fields"`
}
El problema que tengo es que en el modelo de Inversión, no se requiere Grupo. Si no hay grupo, creo que es mejor que no se inserte en la base de datos. ¿Cuál es la mejor manera de manejar un modelo de db como este en Go?
tl; dr : Use ,omitempty
, y si necesita preocuparse por la diferencia entre un valor cero y un valor nulo / no especificado, haga lo que hace la API de GitHub y use un puntero .
Tanto json
como bson
soportan la etiqueta ,omitempty
. Para json, "los valores vacíos son falsos, 0, cualquier puntero nulo o valor de interfaz, y cualquier matriz, sector, mapa o cadena de longitud cero" ( documentos json ). Para bson, ,omitempty
significa "Solo incluya el campo si no está configurado en el valor cero para el tipo o para vaciar cortes o mapas", y los valores cero incluyen cadenas vacías y punteros nulos ( documentos bson ).
Entonces, si realmente necesita una estructura de Grupo, puede poner un *Group
en su lugar, y no se almacenará cuando el puntero sea nulo. Si la Investment
solo necesita mantener el nombre del grupo, es aún más simple: ""
ya que el nombre del grupo evita que se almacene una clave de grupo.
bson
predeterminada el nombre de campo en minúscula, por lo que puede omitir eso de la etiqueta de estructura cuando coinciden. json
usará de forma predeterminada el nombre en mayúscula, así que especifique el nombre en minúsculas en una etiqueta si necesita minúsculas.
Así que, 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 del *Group
Truco de *Group
.