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>
这将创建这样的实现as:
<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中文网其他相关文章!