我正在使用gorm
来定义我的db表架构。注意到gorm
本身对time.Time
使用created_at
而*time.Time
使用deleted_at
。我假设这是因为deleted_at
有NULL
的情况。
我还注意到,对于许多Golang ORM,他们使用sql.NullFloat64
来存储可能是float64
或NULL
的数据库值。为什么不使用*float64
代替sql.NullFloat64
?有什么区别?
type Geo struct {
latitude *float64
longitude sql.NullFloat64
}
// What is the difference between latitude and longitude in this case?
答案 0 :(得分:4)
来自Russ Cox(根据Github的最大Go&#39撰稿人):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*
结构。