首頁  >  文章  >  後端開發  >  如何在 Go 1.18 中安全地使用泛型類型解組 JSON?

如何在 Go 1.18 中安全地使用泛型類型解組 JSON?

Patricia Arquette
Patricia Arquette原創
2024-11-01 12:35:02760瀏覽

How Can I Safely Unmarshal JSON with Generic Types in Go 1.18?

Unmarshal 中的泛型使用(Go 1.18)

在Go 1.18 中使用泛型時,例如創建一個容器來保存一個容器種報告類型,可能會出現類型限制。考慮以下設定:

  • 由結構表示的多種報告類型
  • 帶有泛型類型參數Reportable的ReportContainer包裝器,約束為實作Reportable介面
  • 鑑別器ReportType 用於確定解組期間的特定報告類型

您可以遇到返回類型類型約束的挑戰,導致GetBody() 函數中使用「自由文本語義」來適應類型斷言。

挑戰與解決方案

問題源自於Go 不支援結構的類型斷言,並且不允許指向泛型類型的指標。為了解決這個問題,您可以建立一個介面來實作 LocationID、Provider、ReportType 和 Body 的 Getters。然而,這種解決方案需要犧牲類型安全性。

更安全的方法是放棄參數多態性,並在 JSON 解組期間使用基於鑑別器值的特定 switch 語句。這可確保每種報告類型使用正確的特定類型。

替代方法

對於動態JSON 解析,您可以使用通用的解組函數:

<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>

雖然此函數提供了靈活性,但必須注意,如果它的實作很少,它只執行與直接內聯解組邏輯。因此,只有在引入額外邏輯時,使用此函數才是合理的。

總之,在處理特定類型和 JSON 解組時,請仔細考慮泛型的必要性。必要時選擇基於開關的解決方案,而不影響類型安全,並在使用不必要重複功能的泛型函數時務必小心。

以上是如何在 Go 1.18 中安全地使用泛型類型解組 JSON?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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