I have a struct that I intend to populate with a database record, one of the datetime columns is nullable:
type Reminder struct { Id int CreatedAt time.Time RemindedAt *time.Time SenderId int ReceiverId int }
Since pointers can be nil
, I've made RemindedAt
a pointer, but this will require the code to know the difference between the At
variables. Is there a more elegant way to handle this?
By default DateTime is not nullable because it is a Value Type, using the nullable operator introduced in C# 2, you can achieve this.
The zero value of type Time is January 1, year 1, 00:00:00.000000000 UTC. As this time is unlikely to come up in practice, the IsZero method gives a simple way of detecting a time that has not been initialized explicitly.
Using the DateTime nullable type, you can assign the null literal to the DateTime type. A nullable DateTime is specified using the following question mark syntax.
You can use pq.NullTime
, or with Go 1.13, you can now use the standard library's sql.NullTime
type.
From lib/pq on 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 }
I like the NullTime
example from lib/pq. I tweaked it this way so the NullTime
can be treated like a Time
...
type NullTime struct { time.Time Valid bool }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With