Ich schreibe eine REST-API in Go und arbeite mit Daten, die keinen einzigen Zeitpunkt darstellen.Was ist die idiomatische Art mit Daten ohne Zeit in Golang zu arbeiten?
Es werden JSON-Daten vom und zum Server im Format "2006-01-02" übertragen, wobei diese Daten mit einer MySQL-Datenbank unter Verwendung von DATE-Spalten kommunizieren.
Eine Sache, die ich versucht habe, ist eine Struktur zu erstellen, die eine Zeit einbettet und JSON- und SQL-Konvertierungsschnittstellenimplementierungen implementiert, um korrekt mit den Endpunkten interagieren zu können, während Zeitmethoden für Datumsmathematik und -formatierung verfügbar sind. z.B .:
package localdate
import (
"time"
"encoding/json"
"database/sql/driver"
)
type LocalDate struct {
time.Time
}
func NewLocalDate(year int, month time.Month, day int) LocalDate {
time := time.Date(year, month, day, 0, 0, 0, 0, time.UTC)
return LocalDate{Time: time}
}
const LocalDateFormat = "2006-01-02" // yyyy-mm-dd
func (ld *LocalDate) UnmarshalJSON(data []byte) error {
// parse and set the ld.Time variable
}
func (ld *LocalDate) MarshalJSON() ([]byte, error) {
return json.Marshal(ld.Format(LocalDateFormat))
}
// sql.Scanner implementation to convert a time.Time column to a LocalDate
func (ld *LocalDate) Scan(value interface{}) error {}
// sql/driver.Valuer implementation to go from LocalDate -> time.Time
func (ld *LocalDate) Value() (driver.Value, error) {}
// used to convert a LocalDate into something we can plug into a query
// we could just use ld.Time, but that would send '2015-01-01 00:00:00 +0000 UTC'
// instead of '2015-01-01' for the DATE query parameter. (Which works for mysql, but is officially invalid SQL)
func (ld *LocalDate) SqlDate() string {
return ld.Format(LocalDateFormat)
}
Und dann andere Strukturen dieser Art sein kann, und 90% erhalten dort das Datum Typ in meinem Problem-Domäne darstellt.
Der obige Code funktioniert, aber ich fühle mich wie ich gegen den Go-Strom kämpfe. Also ein paar Fragen für die Veteranen der Sprache:
Denken Sie, dass dieser Code mehr Schmerzen verursachen wird, als es sparen wird?
Wenn ja, welchen Stil würden Sie empfehlen?
Könnten Sie auf „Termine erarbeiten das ist kein einziger Zeitpunkt? " Sind sie Bereiche? – thwd
Entschuldigung für die Verwirrung - Ich habe das Pluralform verwendet, um Daten im Allgemeinen zu bedeuten ... für dieses Szenario habe ich mit einem Datum nach dem anderen zu tun. –
Sie können auch Ihre Methoden auf 'Typ LocalDate time.Time' definieren, wenn Sie keine Einbettung benötigen – metakeule