栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在插入带有时间的文档时设置默认日期。时间字段

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在插入带有时间的文档时设置默认日期。时间字段

在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}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/436227.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号