登录
首页 >  Golang >  Go问答

对于可为空的结构字段,使用 nil 或 Null* 哪个更好

来源:stackoverflow

时间:2024-04-17 18:15:34 444浏览 收藏

本篇文章向大家介绍《对于可为空的结构字段,使用 nil 或 Null* 哪个更好》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

在这里我看到一个关于结构体中可为空字段的问题。 从 go 1.13 开始,您可以使用 sql.nulltime (之前在 pgmysql 中声明)。 从现在开始,我们可以使用这两个选项来声明 resolvedat 可为空的时间字段:

a. resolvedat 为 nulltime:

type event struct {
    id         int   
    resolved   bool
    createdat  time.time
    resolvedat sql.nulltime        
}

b. resolvedat 作为指针:

type event struct {
    id         int 
    resolved   bool
    createdat  time.time
    resolvedat *time.time
}

对于 scan 方法没有区别:

rows, err := db.query("select * from event")

for rows.next() {
    e:= new(event)
    err := rows.scan(&e.id, &e.createdat, &e.resolvedat)
}

但是在测试 null 时存在差异:

// A. 
e.Resolved = (e.ResolvedAt != nil)  
// B.  
e.Resolved = (e.ResolvedAt.Valid)

在什么情况下应该使用 null... 类型而不是指针?


解决方案


Go 缺少 null safety,所以这是一个解决方法。 Null pointers are problematic.

通过使用 sql.NullType,您将在扫描字段中获得 Zero value,而不是 Nil。这一事实,当遇到边缘情况时,可能是您的应用程序恐慌与否的区别。

根据经验,如有疑问,请勿使用指针。

终于介绍完啦!小伙伴们,这篇关于《对于可为空的结构字段,使用 nil 或 Null* 哪个更好》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>