Go 缺乏通用功能,這在嘗試泛化功能時帶來了挑戰。一個常見的場景是需要一個適用於任何傳回值和錯誤的函數的通用錯誤處理函數。
提供的範例示範了使用空介面建立此類函數的嘗試:
<code class="go">func P(any interface{}, err error) (interface{}) { if err != nil { panic("error: "+ err.Error()) } return any }</code>
雖然此方法適用於錯誤處理,但它會遺失類型信息,從而使產生的接口為空。
避免遺失類型資訊的問題,考慮使用程式碼產生來為不同類型建立錯誤處理函數的專門實作。這可以使用「gogenerate」、「gengen」、「genny」或「gen」等工具來實現。
例如,使用“gen”,您可以定義一個模板:
<code class="text">// template.go package main import "fmt" func P[T any](v T, err error) (T) { if err != nil { panic(fmt.Sprintf("error: %v", err)) } return v }</code>
此模板可用於生成P() 的特定於類型的實現:
<code class="sh">gen generate</code>
這將創建諸如以下的實現:
<code class="go">// p_int.go package main func PInt(v int, err error) (int) { if err != nil { panic(fmt.Sprintf("error: %v", err)) } return v }</code>
透過使用這些生成的函數,類型資訊被保留,錯誤處理可以無縫地應用於特定類型。
以上是如何在沒有泛型的 Go 中實作泛型錯誤處理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!