2
我試圖創建一個實現MarshalXML輸出的XML。 但目前我正面臨幾個問題。Golang XML自定義輸出
我使用的用於存儲數據的結構是:
type Edition struct {
Launch string `xml:"launch" json:"launch"`
Code string `xml:"code" json:"code"`
Names []NameNode `xml:"names>name"`
Cards CardsComposition `xml:"cards" json:"cards,omitempty"`
Preconstructed PreconstructedInfo `xml:"preconstructed" json:"preconstructed,omitempty"`
Vault *struct{} `xml:"vault" json:"vault"`
Online *struct{} `xml:"online" json:"online"`
}
我要的是: 如果未設置預先構建的領域,不要把<preconstructed>
標籤(使用標準的封送它即使它是空的)。
所以我所做的是:
func (preconstructed PreconstructedInfo) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
if (PreconstructedInfo{} == preconstructed) {
return nil
}
return e.EncodeElement(preconstructed, start)
}
而且它顯然作品,如果我用它的編碼單版實體。 但是,如果我嘗試編碼版實體的數組,我得到以下錯誤:
runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow
(數組是〜200個)
所以我不明白的是:
- 爲什麼堆棧溢出問題只發生在我嘗試自定義xml時出現,在這種情況下,它也試圖刪除空標籤,所以「節省空間」
- 這樣做的最佳方式是什麼?有人可以向我解釋如何實現一個定製的XML Marshaller去?我發現很多JSON元帥,但幾乎沒有任何XML)
根據你的堆棧溢出,你導致了一個無限循環,所以EncodeElement調用了正在調用EncodeElement的MarshalXML。 – GarMan
好的,但是爲什麼只有嘗試編組一個版本元素纔會發生這種情況,而不是如果我編組單個元素? – Ivan