DizKaz Blog 2024年07月11日
哨兵错误和errors.Is()真的会让代码变慢吗?
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了 Go 语言中错误处理的基准测试结果,并分析了不同错误处理方法的性能和可读性。测试结果显示,使用 `errors.New` 创建错误对象比使用 `fmt.Errorf` 更高效,但后者在可读性方面更胜一筹。作者还建议使用 `errors.As` 和 `errors.Is` 进行错误类型判断,以提高代码的可维护性和可读性。

😊 **性能比较:`errors.New` vs `fmt.Errorf`** 基准测试结果显示,`errors.New` 在创建错误对象方面比 `fmt.Errorf` 更高效。这是因为 `errors.New` 避免了格式化字符串的开销,而 `fmt.Errorf` 需要进行字符串格式化操作。 在性能至关重要的场景中,例如高频的错误处理,使用 `errors.New` 可以带来显著的性能提升。然而,需要注意的是,`errors.New` 只能创建简单的错误信息,而 `fmt.Errorf` 可以使用格式化字符串来创建更详细的错误信息,这在调试和错误分析方面更具优势。 例如,使用 `errors.New` 创建错误信息: go err := errors.New("无法打开文件") 使用 `fmt.Errorf` 创建错误信息: go err := fmt.Errorf("无法打开文件 %s", filename) 使用 `fmt.Errorf` 可以提供更详细的错误信息,例如文件名,这在调试和分析错误时非常有用。

🤔 **错误类型判断:`errors.As` 和 `errors.Is`** Go 语言提供 `errors.As` 和 `errors.Is` 函数用于进行错误类型判断,这可以提高代码的可维护性和可读性。 `errors.As` 用于判断错误是否属于特定的类型,例如: go var pathError *os.PathError if errors.As(err, &pathError) { // 处理路径相关的错误 } `errors.Is` 用于判断错误是否与特定的错误类型匹配,例如: go if errors.Is(err, os.ErrNotExist) { // 处理文件不存在的错误 } 使用 `errors.As` 和 `errors.Is` 可以避免使用 `type assertion`,从而提高代码的可读性和可维护性。

👍 **建议:优先考虑可读性** 虽然 `errors.New` 在性能方面更具优势,但 `fmt.Errorf` 在可读性方面更胜一筹。在实际开发中,应优先考虑代码的可读性和可维护性,而不是仅仅追求性能。 在大多数情况下,`fmt.Errorf` 的性能开销是可以接受的,而它提供的更详细的错误信息可以极大地提高代码的调试和错误分析效率。 此外,`errors.As` 和 `errors.Is` 函数可以有效地提高代码的可读性和可维护性,建议在进行错误类型判断时使用这些函数。

😄 **错误处理的最佳实践** 除了使用 `errors.New` 和 `fmt.Errorf` 创建错误对象,以及使用 `errors.As` 和 `errors.Is` 进行错误类型判断,还可以考虑以下最佳实践: * 使用自定义错误类型:自定义错误类型可以更好地描述错误类型,并方便代码进行错误处理。 * 使用错误包装器:错误包装器可以将原始错误信息包装起来,并添加额外的信息,例如上下文信息或调用堆栈。 * 使用错误日志:记录错误信息可以帮助调试和分析错误。 * 使用错误处理中间件:使用错误处理中间件可以将错误处理逻辑集中到一个地方,并简化代码的编写。

🤔 **总结** Go 语言提供灵活的错误处理机制,可以根据实际情况选择不同的错误处理方式。在选择错误处理方法时,应权衡性能、可读性和可维护性等因素。 建议优先考虑可读性和可维护性,并使用 `fmt.Errorf` 创建更详细的错误信息,使用 `errors.As` 和 `errors.Is` 进行错误类型判断,以及使用错误包装器和错误日志等最佳实践,以提高代码的质量和可维护性。

Source: https://www.dolthub.com/blog/2024-05-31-benchmarking-go-error-handling/

之前的讨论 https://dizkaz.com/articles/505

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Go 错误处理 基准测试 性能 可读性
相关文章