Trong Go, bạn không thể xác định các giá trị mặc định cho các trường, chúng sẽ luôn là giá trị 0 của loại chúng khi một giá trị cấu trúc mới được tạo (trừ khi bạn sử dụng một ký tự tổng hợp nơi bạn có thể cung cấp một giá trị khác một cách rõ ràng).
Vì vậy, một tùy chọn sẽ là tạo một hàm giống như hàm tạo NewUser()
sẽ đặt trường này và luôn sử dụng chức năng này để tạo người dùng mới:
func NewUser() *User {
return &User{
CreatedAt: time.Now(),
}
}
Tất nhiên điều này không thể bị ép buộc và điều này cũng sẽ giữ dấu thời gian của User
cấu trúc tạo giá trị chứ không phải khi nó được lưu.
Một cách tiếp cận khác tốt hơn là sử dụng logic sắp xếp tùy chỉnh.
Bạn có thể viết logic sắp xếp tùy chỉnh bằng cách triển khai bson.Getter
. GetBSON()
có trách nhiệm cung cấp một giá trị thực sự sẽ được lưu lại. Chúng tôi muốn có cùng một User
phiên bản được lưu, chỉ CreatedAt
của nó trường đặt trước:
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
}
Lưu ý rằng một my
mới loại được tạo và trả về. Lý do cho điều này là để tránh tràn ngăn xếp. Chỉ cần trả về giá trị kiểu *User
không tốt, vì nó thực thi bson.Getter
, vì vậy GetBSON()
sẽ được gọi là vô tận. my
mới loại không có phương thức này, vì vậy "đệ quy" vô tận không xảy ra (loại type
từ khóa tạo ra một kiểu mới và nó không "kế thừa" các phương thức của kiểu cơ bản).
Lưu ý rằng giải pháp này cũng sẽ ghi đè (thiết lập lại) CreatedAt
trường) ngay cả khi bạn chỉ muốn lưu lại User
. Vì vậy, chúng ta nên thêm kiểm tra xem CreatedAt
trường được điền và chỉ đặt nó nếu đó là giá trị 0:
func (u *User) GetBSON() (interface{}, error) {
if u.CreatedAt.IsZero() {
u.CreatedAt = time.Now()
}
type my *User
return my(u), nil
}
Cũng xem câu hỏi liên quan / tương tự:Sử dụng MongoDB từ Go