Go 中的泛型是編寫更多可重複使用和類型安全程式碼的強大工具。然而,當涉及到在 Unmarshal 中使用泛型時,我們需要注意一些挑戰。
在此問答中,使用者嘗試使用泛型來建立一種更安全類型的解組方式將 JSON 資料轉換為結構體。他們面臨的問題是他們無法在 GetBody() 函數上使用類型約束,這導致他們必須在程式碼中使用類型斷言。
這樣做的原因是 Go 確實不支援結構的類型斷言,僅支援介面。這意味著,如果不先知道結構體的確切類型,我們就無法將 GetBody() 函數轉換為特定類型。
此問題的一個可能的解決方案是使用 switch 語句來檢查 ReportType 欄位結構體,然後將 GetBody() 函數轉換為適當的類型。然而,這個解決方案不是很優雅,而且隨著結構體可以包含的不同類型數量的增加,它可能很難維護。
解決這個問題的更好的解決方案是在GetBody() 函數。這將使我們能夠將 GetBody() 函數轉換為適當的類型,而無需使用 switch 語句。這是一個更優雅的解決方案,也更容易維護。
為了說明此解決方案,這裡是GetBody() 函數的修改版本:
<code class="go">func (c *ReportContainerImpl[T]) GetBody() (T, error) { var body T var err error switch c.ReportType { case ReportTypeExportDataPointReport: err = json.Unmarshal(c.Body, &body) case ReportTypeImportDataPointReport: err = json.Unmarshal(c.Body, &body) case ReportTypeMissingDataPointReport: err = json.Unmarshal(c.Body, &body) case ReportTypeSensorThresoldReport: err = json.Unmarshal(c.Body, &body) } return body, err }</code>
透過此更改,我們現在可以使用GetBody() 函數檢索結構體,而無需使用switch 語句。這使得程式碼更加優雅並且更易於維護。
以上是如何在 Go 的 Unmarshal 函數中使用泛型型別進行型別安全的 JSON 解析,而無需使用型別斷言?的詳細內容。更多資訊請關注PHP中文網其他相關文章!