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

时间:2015-11-01 01:46:08

标签: go

我正在使用gorm来定义我的db表架构。注意到gorm本身对time.Time使用created_at*time.Time使用deleted_at。我假设这是因为deleted_atNULL的情况。

我还注意到,对于许多Golang ORM,他们使用sql.NullFloat64来存储可能是float64NULL的数据库值。为什么不使用*float64代替sql.NullFloat64?有什么区别?

type Geo struct {
    latitude *float64
    longitude sql.NullFloat64
}
// What is the difference between latitude and longitude in this case?

1 个答案:

答案 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*结构。