Go 缺乏通用功能,這在嘗試泛化功能時帶來了挑戰。一個常見的場景是需要一個適用於任何傳回值和錯誤的函數的通用錯誤處理函數。
提供的範例示範了使用空介面建立此類函數的嘗試:
func P(any interface{}, err error) (interface{}) {
if err != nil {
panic("error: " err.Error())
}
return any
}
雖然此方法適用於錯誤處理,但它會遺失類型訊息,從而使產生的介面為空。
避免出現以下問題丟失類型信息,請考慮使用代碼生成來為不同類型創建錯誤處理函數的專門實現。這可以使用「gogenerate」、「gengen」、「genny」或「gen」等工具來實現。
例如,使用“gen”,您可以定義一個模板:
// 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
}
此範本可用於產生P() 的特定於類型的實作:
gen generate
這將建立諸如以下的實作:
// p_int.go
package main
func PInt(v int, err error) (int) {
if err != nil {
panic(fmt.Sprintf("error: %v", err))
}
return v
}
透過使用這些產生的函數,可以保留類型訊息,並且可以將錯誤處理無縫地應用於特定類型。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3