go语言的null值问题
关于go语言数据库存储和显示null值的问题困扰了我很久,并且也和群友讨论过这个问题,但是都没有得到相对满意和全面的答案。最近fq找了几篇相对详细和权威的文章,分享给大家,希望和大家一起进步,go go go!
文章一:go语言:解决数据库中null值的问题(转载国人文章)
文章二:how i handled possible null values from database rows in golang?(需*)
文章三:working effectively with database nulls(试验过不需要*)
github:
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。 这可能最终会得到解决 。