Обнуляемое время. Время
У меня есть структура, которую я намереваюсь заполнить записью базы данных, один из столбцов datetime имеет значение NULL:
type Reminder struct {
Id int
CreatedAt time.Time
RemindedAt *time.Time
SenderId int
ReceiverId int
}
Поскольку указатели могут быть nil
, я сделал указатель RemindedAt
, но для этого потребуется, чтобы код знал разницу между переменными At
. Есть ли более элегантный способ справиться с этим?
Ответы
Ответ 1
Вы можете использовать pq.NullTime
, или с Go 1.13, теперь вы можете использовать стандартную библиотеку типа sql.NullTime
.
С lib/pq на github:
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
}
Ответ 2
Мне нравится пример NullTime
из lib/pq. Я изменил его таким образом, чтобы NullTime
можно рассматривать как a Time
...
type NullTime struct {
time.Time
Valid bool
}
Ответ 3
Возможно, также стоит проверить реализацию go-sql-драйвера, которая в основном такая же, как рекомендовано выше. https://godoc.org/github.com/go-sql-driver/mysql#NullTime
Ответ 4
mysql.NullTime запрещен https://github.com/go-sql-driver/mysql/issues/960
У database/sql будет тип NullTime начиная с Go1.13, который следует использовать вместоhttps://github.com/golang/go/issues/30305