我有一个结构,我打算用数据库记录填充,其中一个日期时间列可以为空:
type Reminder struct {
Id int
CreatedAt time.Time
RemindedAt *time.Time
SenderId int
ReceiverId int
}
由于指针可以是nil
,我已经将RemindedAt
作为指针,但这需要代码知道At
变量之间的差异。有没有更优雅的方式来处理这个?
答案 0 :(得分:58)
您可以使用pq.NullTime
。
来自github上的lib/pq:
type NullTime struct {
Time time.Time
Valid bool // Valid is true if Time is not NULL
}
// Scan implements the Scanner interface.
func (nt *NullTime) Scan(value interface{}) error {
nt.Time, nt.Valid = value.(time.Time)
return nil
}
// Value implements the driver Valuer interface.
func (nt NullTime) Value() (driver.Value, error) {
if !nt.Valid {
return nil, nil
}
return nt.Time, nil
}
答案 1 :(得分:6)
我喜欢lib / pq中的NullTime
示例。我这样调整了它,因此可以将NullTime
视为Time
...
type NullTime struct {
time.Time
Valid bool
}
答案 2 :(得分:3)
也可能要检查go-sql-driver实现,这与上面推荐的基本相同。 this website
答案 3 :(得分:1)
mysql.NullTime被描述https://github.com/go-sql-driver/mysql/issues/960 从Go1.13开始,数据库/ sql将具有NullTime类型,应改为使用 https://github.com/golang/go/issues/30305