2015-02-11 7 views
17

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?

+0

Könnten Sie auf „Termine erarbeiten das ist kein einziger Zeitpunkt? " Sind sie Bereiche? – thwd

+0

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. –

+5

Sie können auch Ihre Methoden auf 'Typ LocalDate time.Time' definieren, wenn Sie keine Einbettung benötigen – metakeule

Antwort

2

Ich glaube, Sie Ihre Daten als time.Time speichern kann, aber es in eine Zeichenfolge für JSON Zwecke konvertieren:

type LocalDate struct { 
    t time.Time `json:",string"` // might even work anonymously here 
} 

zu sehen, wie diese Arbeit mit SQL zu machen: https://github.com/go-sql-driver/mysql#timetime-support

Verwandte Themen