」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何在 Go 1.18 中安全地使用泛型類型解組 JSON?

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

發佈於2024-11-07
瀏覽:952

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

Unmarshal 中的泛型使用(Go 1.18)

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

  • 由結構表示的多種報告類型
  • 具有通用類型參數的ReportContainer 包裝器可報告,約束為實作可報告介面
  • 鑑別器ReportType 在解組過程中確定特定的報告類型

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

挑戰與解決方案

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

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

替代方法

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

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
}

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

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

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3