В Go вы не можете определить значения по умолчанию для полей, они всегда будут zero-value их типа, когда создается новое значение структура (если вы не используете composite literal, где вы можете дать другое значение явно) ,
Так один из вариантов было бы создать конструктор, как функция NewUser()
, которая будет установлена в этом поле, и всегда использовать эту функцию для создания новых пользователей:
func NewUser() *User {
return &User{
CreatedAt: time.Now(),
}
}
Конечно, это не может быть принужден, и также это будет содержать временную метку создания значения структуры User
, а не когда она будет сохранена.
Другим, лучшим подходом является использование пользовательской логики маршалинга.
Вы можете написать собственную логику маршалинга, реализовав bson.Getter
. GetBSON()
несет ответственность за предоставление значения, которое фактически будет сохранено. Мы хотим, чтобы то же самое User
экземпляра, чтобы спастись, только его CreatedAt
поля устанавливается до:
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
}
Обратите внимание, что новый my
типа создаются и возвращается. Причина этого заключается в том, чтобы избежать переполнения стека. Просто возврат значения типа *User
является плохим, потому что он реализует bson.Getter
, поэтому GetBSON()
будет называться бесконечно. Новый тип my
не имеет этого метода, поэтому бесконечной «рекурсии» не происходит (ключевое слово type
создает новый тип и не наследует методы базового типа).
Обратите внимание, что это решение также перезапишет (переустановит) поле CreatedAt
), даже если вы просто хотите сохранить резервную копию User
. Таким образом, мы должны добавить проверку заполнен ли CreatedAt
поле, и только установить его, если это нулевое значение:
func (u *User) GetBSON() (interface{}, error) {
if u.CreatedAt.IsZero() {
u.CreatedAt = time.Now()
}
type my *User
return my(u), nil
}
Также см связаны/аналогичный вопрос: Accesing MongoDB from Go