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