Jak poradzić sobie z null w GO
Dzisiaj miałem okazję wyprodukować trochę kody w GO, który miał coś wyciągać z MySQL. Dane pochodziły z tabeli, która miała strukturę z polami typu data datetime DEFAULT NULL
. Problem pojawił się przy skanowaniu rekordów:
panic: sql: Scan error on column index 2: unsupported Scan, storing driver.Value type <nil> into type *time.Time
Problem pojawił się, ponieważ skaner nie potrafi przerobić null’a na datę. Generalnie można skorzystać z typu mysql.NullTime który znajduje się w pakiecie database/sql – dodaje on dodatkowe pole typu “Valid” które wskazuje na to, czy wartość jest typu NULL czy nie. Podobna obsługa jest dla pól typu string i numerycznych.
Problem pojawia się kiedy spróbujemy ten typ przerobić na JSON’a:
Data:mysql.NullTime{Time:time.Time{sec:0, nsec:0, loc:(*time.Location)(nil)}, Valid:false}
I można tutaj kombinować z nadpisywanie interfaceów, albo skorzystać z pakietu:
gopkg.in/guregu/null.v3
. Ogarnia on sprawę za nas – wystarczy zmienić tylko typu na null.String