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