我正在使用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*
结构体。
- 1 回答
- 0 关注
- 167 浏览
添加回答
举报
0/150
提交
取消