在Golang中使用sql.NullFloat64还是*float64?

4
我正在使用gorm来定义我的数据库表结构。注意到gorm本身将time.Time用于created_at,而将*time.Time用于deleted_at。我认为这是因为deleted_at有时可能为NULL
我还注意到,对于许多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个回答

6

来自Russ Cox(Github上最大的Go贡献者)的消息:https://groups.google.com/forum/#!topic/golang-nuts/vOTFu2SMNeA

没有实际区别。我们认为人们可能想使用NullString,因为它非常常见,也许比*string更清晰地表达了意图。但两者都可以工作。

我认为使用指针可能会让GC多跟踪一件事。这可能取决于用法。

在一些非常简单的代码中,使用-gcflags=-m进行构建,逃逸分析确实会说new(float64)逃逸到堆(这是我使用的虚拟代码:https://play.golang.org/p/K4sQaXyQKG)。

此外,在调试时,打印一个包含 sql.NullSomething 的结构体({value:{Float64:1 Valid:true}})比打印一个指针的结构体好看({value:0xc82000a420})。
因此,我建议使用 sql.Null* 结构体。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接