首頁  >  文章  >  後端開發  >  Go 1.18 中可以使用泛型來進行 JSON 解組嗎?

Go 1.18 中可以使用泛型來進行 JSON 解組嗎?

Patricia Arquette
Patricia Arquette原創
2024-10-30 22:22:03549瀏覽

Can Generics Be Used for JSON Unmarshaling in Go 1.18?

Go 1.18 中的泛型和解組

在 Go 1.18 中,泛型為語言帶來了增強的類型安全性。但是,當將泛型與解組 JSON 資料結合使用時,會出現某些限制。

考慮涉及多個報表類型的場景,每個報表類型都封裝在 ReportContainerImpl 中。此容器包含限制為實作 Reportable 介面的參數,代表各種報表類型。然而,由於 Go 缺乏對結構的類型斷言和指向原始泛型類型的指標的支持,解組帶來了挑戰。

為了解決這個問題,引入了一個介面 ReportContainer,允許 ReportContainerImpl 來實作它。但是,無法強制執行對 GetBody() 傳回類型的類型約束,從而導致在解組期間需要進行類型斷言。

難題在於編譯期間必須知道泛型型別參數,而 JSON解組在執行時使用動態資料進行。

克服挑戰

最可行的解決方案是放棄此特定用例的參數多態性。建議維護現有的 json.RawMessage 方法,在 switch 語句內有條件地解組動態數據,並傳回實作 ReportContainer 介面的特定結構。

替代解決方案:通用解組函數

在編譯時可以知道類型參數的情況下,可以使用通用解組函數,如下所示:

<code class="go">func unmarshalAny[T any](bytes []byte) (*T, error) {
    out := new(T)
    if err := json.Unmarshal(bytes, out); err != nil {
        return nil, err
    }
    return out, nil
}</code>

雖然這示範了通用解組的概念,但應該注意的是Go 的json.Unmarshal 已經支援解組為任何類型。因此,自訂泛型函數只會增加複雜性,而不會提供額外的價值。

總之,在 Go 中處理動態 JSON 資料和解組時,建議透過適當使用介面和型別斷言來支援型別安全。參數多態性。

以上是Go 1.18 中可以使用泛型來進行 JSON 解組嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn