问题描述
在Go中,您无法定义字段的默认值,当创建新的struct值时,它们将始终是其类型的零值(除非您使用复合文字,可以在其中显式给出其他值)。
因此,一种选择是创建一个类似于构造函数的函数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
创建并返回一个新类型。这样做的原因是为了避免堆栈溢出。简单地返回type的值*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
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)