タイプ time.Time に基づいて独自のタイプ Date を作成する際に問題があります
私は次のように日付型を作成しようとしました:
type Date time.Time
func (d Date) UnmarshalJSON(buf []byte) error {
var s string
json.Unmarshal(buf, &s)
t, err := time.Parse(timeLayout,s)
d= Date(t)
return err
}
func (d Date) MarshalJSON() ([]byte, error) {
b,_ := json.Marshal(d.Format(timeLayout))
return b,nil
}
これ自体は機能します。この Date を time.Time として AppEngine Datastore に保存できます。マーシャリング自体も機能しますが、機能していません。json からアンマーシャリングすると、Date d に値が入力されます。これは、unmarshalJson 関数が Date のコピーを作成するためです。
したがって、 unmarshalJson 関数を変更して Pointer to Date を使用すると、使用できなくなります。
d=Date(t)
最初の質問ですが、これを行う方法はありますか?
私が今行ったことは、コードを次のように書き直すことです。
type Date struct {
t time.Time
}
func (d *Date) UnmarshalJSON(buf []byte) error {
var s string
json.Unmarshal(buf, &s)
t, err := time.Parse(timeLayout,s)
d.t = t
return err
}
func (d Date) MarshalJSON() ([]byte, error) {
b,_ := json.Marshal(d.t.Format(timeLayout))
return b,nil
}
これは機能しますが、この場合、 Date は time.Time の拡張型ではなく、 time.Time 型の単なるラッパーです。
これを行うためのより良い解決策はありますか? 私はまだ行くのが初めてです。
Chromeはhtml5タイプのみをサポートしているため、datetimeではなくdateのみをサポートしているため、JSON形式のDateのみを持つには、このDateタイプが必要です。メソッドのオーバーライドは go では不可能です (タイプ time.Time の un/marshalJson メソッドをオーバーライドすることを意味します)?
ありがとう