2015-02-11 5 views
17

मैं गो में एक आरईएसटी एपीआई लिख रहा हूं, उन तिथियों के साथ काम कर रहा हूं जो समय में एक बिंदु का प्रतिनिधित्व नहीं करते हैं।गोलांग में बिना समय के तिथियों के साथ काम करने का बेवकूफ तरीका क्या है?

यह जेएसओएन डेटा "2006-01-02" प्रारूप में सर्वर से और सर्वर पर जा रहा है, उस डेटा के साथ DATE कॉलम का उपयोग करके एक MySQL डेटाबेस से बात कर रहा है।

एक चीज जो मैंने कोशिश की है वह एक समय को एम्बेड करने वाली संरचना बनाने के लिए है, और जेएसओएन और एसक्यूएल रूपांतरण इंटरफ़ेस कार्यान्वयन लागू करता है ताकि अंतराल के साथ सही तरीके से बातचीत करने में सक्षम हो सके, जबकि अभी भी दिनांक गणित और स्वरूपण के लिए समय विधियां उपलब्ध हैं। उदा .:

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) 
} 

और फिर अन्य structs इस प्रकार के हो सकते हैं, और वहाँ मेरी समस्या डोमेन दिनांक प्रकार का प्रतिनिधित्व करने के लिए 90% मिलता है।

उपरोक्त कोड काम करता है, लेकिन मुझे लगता है कि मैं गो चालू के खिलाफ लड़ रहा हूं। तो भाषा के दिग्गजों के लिए कुछ प्रश्न:

क्या आपको लगता है कि यह कोड सहेजने से अधिक दर्द का कारण बन जाएगा?
यदि हां, तो आप किस शैली की सिफारिश करेंगे?

+0

आप "तारीखों को विस्तृत किया जा सका:

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

एसक्यूएल के साथ इस काम करने के लिए कैसे को देखने के लिए जो समय में एक बिंदु का प्रतिनिधित्व नहीं करता है "? क्या वे हैं? – thwd

+0

भ्रम के लिए खेद है - मैंने सामान्य रूप से तारीखों के लिए बहुवचन रूप का उपयोग किया ... इस परिदृश्य के लिए मैं एक समय में एक तारीख से निपट रहा हूं। –

+5

आप पर अपनी विधियों को भी परिभाषित कर सकते हैं 'स्थानीय दिनांक समय टाइप करें। समय' यदि आपको – metakeule

उत्तर

2

मुझे लगता है कि आप time.Time के रूप में अपने डेटा स्टोर लेकिन JSON प्रयोजनों के लिए एक स्ट्रिंग के लिए परिवर्तित कर सकते हैं: https://github.com/go-sql-driver/mysql#timetime-support

संबंधित मुद्दे

 संबंधित मुद्दे