Unmarshal 中的泛型使用(Go 1.18)
在Go 1.18 中使用泛型時,例如創建一個容器來保存一個容器種報告類型,可能會出現類型限制。考慮以下設定:
您可能會遇到返回類型類型約束的挑戰,導致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中文網其他相關文章!