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

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

Patricia Arquette
發布: 2024-11-01 12:35:02
原創
836 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板