3

タイプ 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 メソッドをオーバーライドすることを意味します)?

ありがとう

4

1 に答える 1

2

完全にテストされていないコード:

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
}
于 2012-11-16T10:38:07.377 に答える