在 Golang 中使用 sql.NullFloat64 与 *float64?

我正在使用gorm来定义我的数据库表架构。注意到它gorm本身使用time.Timeforcreated_at和*time.Timefor deleted_at。我假设这是因为deleted_at有NULL.


我还注意到,对于许多 Golang ORM,它们sql.NullFloat64用于存储可能是 afloat64或NULL. 为什么不直接使用*float64代替sql.NullFloat64?有什么不同?


type Geo struct {

    latitude *float64

    longitude sql.NullFloat64

}

// What is the difference between latitude and longitude in this case?


湖上湖
浏览 168回答 1
1回答

回首忆惘然

来自Russ Cox(根据 Github 的最大围棋贡献者):https ://groups.google.com/forum/#! topic/ golang-nuts/vOTFu2SMNeA没有有效的区别。我们认为人们可能想要使用 NullString,因为它非常常见,并且可能比 *string 更清楚地表达意图。但两者都可以。我在想,虽然使用指针可能会给 GC 带来更多要跟踪的事情。这可能取决于用法。在-gcflags=-m用于构建的一些非常简单的代码上,转义分析确实说明了这一点new(float64) escapes to heap(这是我使用的虚拟代码:https : //play.golang.org/p/K4sQaXyQKG)。此外,在调试时,打印包含sql.NullSomething( {value:{Float64:1 Valid:true}}) 的结构看起来比包含指针 ( {value:0xc82000a420})的结构更好。所以我建议使用sql.Null*结构体。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go