Golang Go语言中 rust 风格的错误处理

依旧需要写一些样板代码 不过可以少写很多 iferr

https://github.com/ayasechan/go-result


Golang Go语言中 rust 风格的错误处理
9 回复

👍加大力度, 下一步就是把 unwrap 给变成 ?, gonyhow 腾空出世.

更多关于Golang Go语言中 rust 风格的错误处理的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


缺少了编译器级别的支持,不管用库怎么模拟看上去都很别扭。

同意。

比如 C 的错误处理(

相比,更喜欢 Zig 的错误处理语法。

Zig 连错误数据都无法一并返回 说实话编译器这么成熟这种地方能这么半成品我都惊了

惊了。好像是这么回事。

zig 距离 1.0 感觉还很遥远。

这不就是函数式编程里的 monad 吗?

在Go语言中,虽然其设计哲学倾向于简洁和直接,但面对复杂场景下的错误处理,借鉴Rust风格的错误处理机制可以是一个有趣的探讨。Rust以其强大的类型系统和所有权模型著称,其错误处理主要通过Result<T, E>枚举类型来实现,强制开发者显式处理可能发生的错误,这在很大程度上避免了未处理的异常导致的程序崩溃。

Go语言传统上通过返回两个值(通常是值和错误)来处理错误,这种方式虽然有效,但在嵌套函数调用中容易导致“错误金字塔”问题,代码可读性下降。为了模仿Rust的风格,Go开发者可以:

  1. 定义自定义错误类型:通过定义结构体来实现更丰富的错误信息,包括错误码、消息等,类似于Rust中的E类型。

  2. 使用Result类型:虽然Go标准库没有内置的Result类型,但可以通过定义一个简单的泛型结构体(Go 1.18及以上版本支持泛型)来模拟,如type Result[T any, E error] struct { Value T; Err E }

  3. 推广显式错误处理:鼓励在函数调用后立即检查错误,避免错误累积和未处理的错误传播。

  4. 利用中间件或装饰器模式:对于频繁的错误处理模式,可以考虑使用中间件或装饰器来简化代码,这在Go社区中有一些实践案例。

尽管Go语言本身的设计哲学与Rust有所不同,但借鉴Rust的错误处理风格,结合Go语言的特性,可以帮助我们编写更加健壮和可维护的代码。

回到顶部