Dans Go, vous ne pouvez pas définir de valeurs par défaut pour les champs, ils seront toujours la valeur zéro de leur type lorsqu'une nouvelle valeur de structure est créée (sauf si vous utilisez un littéral composite où vous pouvez donner explicitement une valeur différente).
Donc, une option serait de créer une fonction de type constructeur NewUser()
qui définirait ce champ, et utiliserait toujours cette fonction pour créer de nouveaux utilisateurs :
func NewUser() *User {
return &User{
CreatedAt: time.Now(),
}
}
Bien sûr, cela ne peut pas être forcé, et cela contiendra également l'horodatage de l'User
création de valeur de structure et non lors de son enregistrement.
Une autre meilleure approche consiste à utiliser une logique de marshaling personnalisée.
Vous pouvez écrire une logique de marshaling personnalisée en implémentant bson.Getter
. GetBSON()
est chargé de fournir une valeur qui sera effectivement sauvegardée. Nous voulons le même User
instance à enregistrer, juste son CreatedAt
champ défini avant :
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
}
Notez qu'un nouveau my
type est créé et renvoyé. La raison en est d'éviter le débordement de pile. Renvoyer simplement une valeur de type *User
est mauvais, car il implémente bson.Getter
, donc GetBSON()
serait appelé sans fin. Le nouveau my
type n'a pas cette méthode, donc la "récursivité" sans fin ne se produit pas (le type
mot-clé crée un nouveau type, et il "n'hérite" pas des méthodes du type sous-jacent).
Notez que cette solution écrasera (réinitialisera) également le CreatedAt
champ) même si vous souhaitez simplement ré-enregistrer un User
. Nous devons donc ajouter une vérification si le CreatedAt
champ est rempli et ne le définissez que s'il s'agit de la valeur zéro :
func (u *User) GetBSON() (interface{}, error) {
if u.CreatedAt.IsZero() {
u.CreatedAt = time.Now()
}
type my *User
return my(u), nil
}
Voir également la question connexe/similaire :Accéder à MongoDB depuis Go