2015-11-01 62 views
3

我正在使用gorm來定義我的數據庫表模式。注意到gorm本身使用time.Timecreated_at*time.Timedeleted_at。我假設這是因爲deleted_atNULL的情況。在Golang中使用sql.NullFloat64 vs * float64?

我還注意到,對於許多Golang ORM,他們使用sql.NullFloat64來存儲可能爲float64NULL的db值。爲什麼不使用*float64而不是sql.NullFloat64?有什麼不同?

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

回答

4

Russ Cox(最大根據Github上Go的貢獻者):https://groups.google.com/forum/#!topic/golang-nuts/vOTFu2SMNeA

有沒有實際的區別。我們認爲人們可能想要使用NullString,因爲它很常見,可能比*字符串更清楚地表達意圖。但是兩者都可以工作。

我在想雖然使用指針可能會給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*結構。