要不模拟 rust 的处理方式,
rust 是用 Result<OK, Err>,配合问号后缀语法糖来解决的,
所以可以首先用
https://github.com/Boyux/go_macro让 go 能有类似 rust 的问号后缀语法糖,简化判断 is err 的处理,
然后在 go 代码里模拟 Result<OK, Err>,就行了,比如
// 定义 Result 类型,它有两个类型参数,一个表示成功的值类型,一个表示错误类型
type Result[T any, E error] struct {
value T
err E
}
// Ok 构造函数,用于创建表示成功的 Result 实例
func Ok[T any, E error](v T) Result[T, E] {
return Result[T, E]{
value: v,
err: nil,
}
}
// Err 构造函数,用于创建表示失败(有错误)的 Result 实例
func Err[T any, E error](e E) Result[T, E] {
return Result[T, E]{
value: *new(T),
err: e,
}
}
// IsOk 方法判断 Result 是否是成功状态
func (r Result[T, E]) IsOk() bool {
return r.err == nil
}
// IsErr 方法判断 Result 是否是错误状态
func (r Result[T, E]) IsErr() bool {
return r.err!= nil
}
// Unwrap 方法,如果是成功状态则返回值,若是错误状态则触发 panic (类似 Rust 中直接使用.操作符获取值但不处理错误的情况)
func (r Result[T, E]) Unwrap() T {
if r.IsErr() {
panic(r.err)
}
return r.value
}
// UnwrapErr 方法,如果是错误状态则返回错误,否则返回 nil
func (r Result[T, E]) UnwrapErr() E {
return r.err
}
func divide(a, b int) Result[int, error] {
if b == 0 {
return Err[int, error](fmt.Errorf("division by zero"))
}
return Ok[int, error](a / b)
}
func main() {
result := divide(10, 2)
if result.IsOk() {
fmt.Println("Result:", result.Unwrap())
} else {
fmt.Println("Error:", result.UnwrapErr())
}
}