2017-03-09 31 views
0

我試圖在將用JSON進行編碼/解碼的結構中使用time.Time結構。如果未設置time.Time屬性(omitempty標記),則不應包含time.Time屬性,因此爲了能夠這樣做,我將不得不使用指向time.Time對象的指針。分配給接收器方法中的零指針

我已經定義了一個類型爲time.Time結構,使我可以輕鬆地創建接收機功能格式化時間的JSON進行編碼和解碼等

在這裏看到的代碼:https://play.golang.org/p/e81xzA-dzz

所以在我的主結構(實際上將被編碼結構),我會做這樣的事情:

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

的問題是,指針可以是零,試圖將值解碼的時候,所以如果你看一下我的代碼在日e去操場,你可以看到,我試圖(使用雙指針)設置接收器的地址,如果它的零。參見方法「Set」和「swap」。

但是,這似乎並沒有工作。該程序不會失敗或任何事情,但「EncodeThis」結構將不包含對這個新地址的引用。任何想法解決這個問題?

+0

您的遊樂場不完整。請修復它到可編譯狀態。 – I159

+0

問題是它的一千行代碼和很多依賴關係。問題在於Set方法,當接收器指針爲零時。我需要爲它分配內存,或者在Set-method中重新分配地址。但我不知道如何做到這一點。或者如果它真的可能。最壞的情況我需要在創建時爲它們創建內存,但是將它作爲指針是沒用的。 – 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

謝謝。但是我不得不重新設計我如何處理這個問題,這與你如何做到這一點相似。我擴展了'jWDate'-結構以簡單地擁有'New()'方法,它分配內存(直到程序員實際使用它所需的內存),以確保內存地址不會被任何其他去程序。 – Joachim