sort gopkg golang go mgo

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 .