關於go語言數據庫存儲和顯示null值的問題困擾了我很久,並且也和群友討論過這個問題,但是都沒有得到相對滿意和全面的答案。最近翻牆找了幾篇相對詳細和權威的文章,分享給大家,希望和大家一起進步,go go go!
文章一:Go語言:解決數據庫中null值的問題(轉載國人文章)
文章二:How I handled possible null values from database rows in Golang?(需科學上網)
文章三:Working effectively with database nulls(試驗過不需要科學上網)
Github:有沒有專門的null值函數庫?
https://github.com/guregu/null介紹
import "gopkg.in/guregu/null.v3"
null是一個具有合理選項的庫,用於處理可空的SQL和JSON值
有兩個包: null及其子包zero 。
null類型僅在null輸入時被視為null,並且JSON將編碼為null 。 如果您需要零並且null被視為單獨的值,請使用這些值。
zero中的類型在Go中被視為零值:空字符串輸入將生成空零zero.String ,並且空字符串將JSON編碼為"" 。 這些類型的零值將被視為對SQL無效。 如果你需要零和null處理相同,使用這些。
所有類型都實現了sql.Scanner和driver.Valuer ,因此您可以使用此庫代替sql.NullXXX 。 所有類型還實現: encoding.TextMarshaler , encoding.TextUnmarshaler , json.Marshaler和json.Unmarshaler 。
null包
import "gopkg.in/guregu/null.v3"
null.String
可以為空的字符串。
如果SQL源數據為空,則Marshals為JSON null。 零(空白)輸入不會產生空字符串。 可以從sql.NullString JSON輸入或字符串輸入解sql.NullString 。
null.Int
可以為null的int64。
如果SQL源數據為空,則Marshals為JSON null。 零輸入不會產生null Int。 可以從sql.NullInt64 JSON輸入解sql.NullInt64 。
null.Float
可空浮動64。
如果SQL源數據為空,則Marshals為JSON null。 零輸入不會產生null Float。 可以從sql.NullFloat64 JSON輸入解sql.NullFloat64 。
null.Bool
可空的布爾。
如果SQL源數據為空,則Marshals為JSON null。 虛假輸入不會產生null Bool。 可以從sql.NullBool JSON輸入解sql.NullBool 。
null.Time
如果SQL源數據為空,則Marshals為JSON null。 使用time.Time的封送者。 可以從pq.NullTime和類似的JSON輸入解pq.NullTime 。
零包裝
import "gopkg.in/guregu/null.v3/zero"
zero.String
可以為空的字符串。
如果為null,將Marshal編排為空字符串。 空字符串輸入生成空字符串。 空值和零值被認為是等價的。 可以從sql.NullString JSON輸入解sql.NullString 。
zero.Int
可以為null的int64。
如果為null,將Marshal編排為0。 0產生一個空Int。 空值和零值被認為是等價的。 可以從sql.NullInt64 JSON輸入解sql.NullInt64 。
zero.Float
可空浮動64。
如果為null,將Marshal編排為0。 0.0產生一個null Float。 空值和零值被認為是等價的。 可以從sql.NullFloat64 JSON輸入解sql.NullFloat64 。
zero.Bool
可空的布爾。
如果為null,將Marshal編排為false。 false產生一個null Float。 空值和零值被認為是等價的。 可以從sql.NullBool JSON輸入解sql.NullBool 。
zero.Time
如果為null,將Marshal編排為零時間。 使用time.Time的封送者。 可以從pq.NullTime和類似的JSON輸入解pq.NullTime 。
錯誤
json的",omitempty"結構標記現在無法正常工作。 它永遠不會省略null或空String。 這可能最終會得到解決 。
