2017-03-09 6 views
0

time.Time構造体をJSONでエンコード/デコードされる構造体に使用しようとしています。 time.Time属性が設定されていない場合(omitemptyタグ)は含まれないようにする必要があります。そのためにはtime.Timeオブジェクトへのポインタを使用する必要があります。受信側メソッドでnilポインタに割り当て

私は簡単にレシーバ関数を作成することができますので、私はtime.Time構造の型を定義したJSONをエンコードされた時刻をフォーマットし、デコードなど

ここにコードを参照してください:私のメインの中のSO https://play.golang.org/p/e81xzA-dzz

を構造(実際にエンコードされる構造)私はこのような何かを行います。

type EncodeThis struct { 
    Str string `json:"str,omitempty"` 
    Date *jWDate `json:"date,omitempty"` 
} 

問題は値を解読しようとすると、ポインタは、ゼロであってもよいことであるので、あなたは目で自分のコードを見れば私が(2重ポインタを使って)受信者のアドレスをnilに設定しようとしているのを見ることができます。メソッド "Set"と "swap"を参照してください。

しかし、これはうまくいかないようです。プログラムは失敗しないか、何もしませんが、 "EncodeThis"構造体にはこの新しいアドレスへの参照が含まれません。これを修正するためのアイデアはありますか?

+0

プレイグラウンドが不完全です。コンパイル可能な状態に修正してください。 – I159

+0

問題は、その1000行のコードと多くの依存関係です。この問題は、受信側ポインタがnilの場合のSetメソッドにあります。私はそれにメモリを割り当てるか、Setメソッド内でアドレスを再割り当てする必要があります。しかし、私はこれを行う方法を知らない。または、本当に可能ならば。最悪の場合、私は作成時にそれらにメモリを作成する必要がありますが、それをポインタとして持つことは無意味です。 – Joachim

+0

http://stackoverflow.com/questions/23695479/format-timestamp-in-outgoing-json-in-golang – Ravi

答えて

1

time.Timeオブジェクトへのポインタを含む構造体で日付オブジェクトをラップします。

// JWDate: Numeric date value 
type jWDate struct { 
    date *time.Time 
} 

func (jwd *jWDate) Set(t *time.Time) { 
    if jwd.date == nil { 
     jwd.date = t 
    } 
} 

あなたがそれを埋め込むことができるjWDate構造体からtime.Timeメソッドにアクセスする必要があります。埋め込み型では、オブジェクトのポインタに簡単にアクセスできます。

// JWDate: Numeric date value 
type jWDate struct { 
    *time.Time // Embedded `time.Time` type pointer, not just an attribute 
} 

func (jwd *jWDate) Set(t *time.Time) { 
    if jwd.Time == nil { 
     jwd.Time = t 
    } 
} 
+0

ありがとうございます。しかし、私はこれをどのように処理するかを再設計しなければなりませんでした。私は 'new()'メソッドを単に持たせるために 'jWDate'構造体を拡張しました。これはメモリアドレスが他のジャンプルーチンによって変更されていないことを保証するためにメモリを割り当てます。 – Joachim

関連する問題