为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
湖上湖 2021-11-22 10:26:55
我正在使用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?
查看完整描述

1 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

来自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*结构体。


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信