在 UnmarshalJSON 函數內呼叫 json.Unmarshal 不會導致堆疊溢位
在處理 JSON 資料時,我們通常會使用 json.Unmarshal 函數將 JSON 字串解析為 Go 語言中的結構體。然而,在 UnmarshalJSON 函數內部呼叫 json.Unmarshal 函數可能會導致堆疊溢位的錯誤。這是因為 UnmarshalJSON 函數在解析 JSON 資料時會再次呼叫自身,進而導致無限迴圈。為了避免這種情況,我們可以使用 json.Decoder 的 Decode 方法來解析 JSON 數據,而不是直接呼叫 json.Unmarshal 函數。這樣做可以確保不會造成堆疊溢位的問題,並確保程式碼的健全性和效能。
問題內容
我想執行一些額外的步驟來初始化我的實作 UnmarshalJSON
中的資料結構。在該實作中呼叫 json.Unmarshal(b, type)
自然會導致堆疊溢位。
JSON 解碼器不斷嘗試尋找是否有自訂 UnmarshalJSON
實現,然後再次呼叫 json.Unmarshal
。
還有其他方法可以做到這一點嗎?只需呼叫底層預設實作就不會導致此問題?
解決方法
避免這種情況/防止這種情況的簡單而常見的方法是使用type
關鍵字,並使用類型conversion 來傳遞該類型的值(該值可以如果是您的原始值,則可以進行類型轉換,因為新類型將原始類型作為其基礎類型)。
這是有效的,因為 type
關鍵字建立了一個新類型,並且新類型將具有零個方法(它不會「繼承」基礎類型的方法)。
這會產生一些運行時開銷嗎?否。引用自 規格:轉換:
#讓我們來看一個例子。我們有一個帶有數字 Age
的 Person
類型,並且我們要確保 Age
不能為負數(小於 0
)。
type Person struct { Name string `json:"name"` Age int `json:"age"` } func (p *Person) UnmarshalJSON(data []byte) error { type person2 Person if err := json.Unmarshal(data, (*person2)(p)); err != nil { return err } // Post-processing after unmarshaling: if p.Age < 0 { p.Age = 0 } return nil }
測試它:
var p *Person fmt.Println(json.Unmarshal([]byte(`{"name":"Bob","age":10}`), &p)) fmt.Println(p) fmt.Println(json.Unmarshal([]byte(`{"name":"Bob","age":-1}`), &p)) fmt.Println(p)
輸出(在 Go Playground 上嘗試):
<nil> &{Bob 10} <nil> &{Bob 0}
當然,相同的技術也適用於自訂封送處理(MarshalJSON()
):
func (p *Person) MarshalJSON() ([]byte, error) { // Pre-processing before marshaling: if p.Age < 0 { p.Age = 0 } type person2 Person return json.Marshal((*person2)(p)) }
測試它:
p = &Person{"Bob", 10} fmt.Println(json.NewEncoder(os.Stdout).Encode(p)) p = &Person{"Bob", -1} fmt.Println(json.NewEncoder(os.Stdout).Encode(p))
輸出(在同一個 Go Playground 範例中):
{"name":"Bob","age":10} <nil> {"name":"Bob","age":0} <nil>
一個非常相似的問題是,當您為fmt
的自訂文字表示定義 的自定义文本表示定义 String() string
方法時a> 包,並且您想若要使用您修改的預設字串表示形式。在這裡閱讀更多相關資訊:t 和 *t 之間的差異
以上是在 UnmarshalJSON 函數內呼叫 json.Unmarshal 不會導致堆疊溢位的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

是的,H5頁面製作是前端開發的重要實現方式,涉及HTML、CSS和JavaScript等核心技術。開發者通過巧妙結合這些技術,例如使用<canvas>標籤繪製圖形或使用JavaScript控制交互行為,構建出動態且功能強大的H5頁面。

關於inline-block元素錯位顯示的原因及解決方案在編寫網頁佈局時,我們常常會遇到一些看似奇怪的顯示問題。比...

CSS自定義resize符號的方法與背景色統一在日常開發中,我們經常會遇到需要自定義用戶界面細節的情況,比如調...

如何實現分段器的45度曲線效果?在實現分段器的過程中,如何讓點擊左側按鈕時右側邊框變成45度曲線,而點�...

實時比特幣美元價格 影響比特幣價格的因素 預測比特幣未來價格的指標 以下是 2018-2024 年比特幣價格的一些關鍵信息:

如何使用JavaScript或CSS控制瀏覽器打印設置中的頁首和頁尾在瀏覽器的打印設置中,有一個選項可以控制是否顯�...
