J'ai une structure que j'ai l'intention de remplir avec un enregistrement de base de données, l'une des colonnes datetime est nullable:
type Reminder struct {
Id int
CreatedAt time.Time
RemindedAt *time.Time
SenderId int
ReceiverId int
}
Comme les pointeurs peuvent être nil
, j'ai fait de RemindedAt
un pointeur, mais cela nécessitera que le code connaisse la différence entre les variables At
. Existe-t-il une manière plus élégante de gérer cela?
Vous pouvez utiliser pq.NullTime
.
De lib/pq sur 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
}
J'aime l'exemple NullTime
de lib/pq. Je l'ai modifié de cette façon pour que le NullTime
puisse être traité comme un Time
...
type NullTime struct {
time.Time
Valid bool
}
Pourrait également vouloir vérifier l'implémentation du pilote go-sql, qui est fondamentalement la même chose que celle recommandée ci-dessus. https://godoc.org/github.com/go-sql-driver/mysql#NullTime
mysql.NullTime est déprécié https://github.com/go-sql-driver/mysql/issues/96 database/sql aura un type NullTime à partir de Go1.13, qui devrait être utilisé à la place https://github.com/golang/go/issues/30305