En mongoose ( node.js ) puedo definir un esquema de modelo con una fecha predeterminada Date.now así:
... type: Date, default: Date.now ... ¿Cómo logro lo mismo sin tener que insertar el time.Time cada vez que creo un documento con mgo ?
type User struct { CreatedAt time.Time `json:"created_at" bson:"created_at"` // Make this field filled automatically with time.Now() every time a document of this `struct` is inserted }En Go no puede definir valores predeterminados para los campos, siempre serán el valor cero de su tipo cuando se crea un nuevo valor de estructura (a menos que use un literal compuesto donde pueda dar un valor diferente explícitamente).
Entonces, una opción sería crear una función similar a un constructor NewUser() que establecería este campo y usaría siempre esta función para crear nuevos usuarios:
func NewUser() *User { return &User{ CreatedAt: time.Now(), } } Por supuesto, esto no se puede forzar, y también mantendrá la marca de tiempo de la creación del valor de la estructura del User y no cuando se guarde.
Otro enfoque mejor es utilizar una lógica de serialización personalizada.
Puede escribir una lógica de serialización personalizada implementando bson.Getter . GetBSON() es responsable de proporcionar un valor que realmente se guardará. Queremos que se guarde la misma instancia de User , solo su campo CreatedAt en establecido antes:
type User struct { CreatedAt time.Time `json:"created_at" bson:"created_at"` } func (u *User) GetBSON() (interface{}, error) { u.CreatedAt = time.Now() type my *User return my(u), nil } Tenga en cuenta que se crea y se devuelve un nuevo tipo my . La razón de esto es evitar el desbordamiento de la pila. Simplemente devolver un valor de tipo *User es malo, porque implementa bson.Getter , por lo que GetBSON() se llamaría sin cesar. El nuevo tipo my no tiene este método, por lo que no se produce una "recursión" interminable (la palabra clave type crea un nuevo tipo y no "hereda" los métodos del tipo subyacente).
Tenga en cuenta que esta solución también sobrescribirá (reestablecerá) el campo CreatedAt ) incluso si solo desea volver a guardar un User . Entonces, deberíamos agregar una verificación si el campo CreatedAt está lleno, y solo configurarlo si es el valor cero:
func (u *User) GetBSON() (interface{}, error) { if u.CreatedAt.IsZero() { u.CreatedAt = time.Now() } type my *User return my(u), nil }Consulte también una pregunta relacionada/similar: Acceso a MongoDB desde Go