• Go返回错误的时候, 返回的值应该可用吗?
  • 发布于 2小时前
  • 15 热度
    10 评论
现在写的一个函数, 会返回多种错误, 我想的是在一些错误的时候, 值也是部份可用的, 在另一些错误的时候, 值是不可用的,之前看到有说函数返回错误的时候, 应该默认正常返回的值为 nil, 不知道有没有这个说法?
用户评论
  • 耀国
  • // 声明类型方便理解
    var err error
    var warnings []warning
    var result xxx
    // 调用
    err,warnings,result = callfunc(args)
    可以参考这种。
  • 2025/11/7 9:08:00 [ 0 ] [ 0 ] 回复
  • 春风不醉
  • 返回 err 了,一般值就认为是失效了,特别是有指针的情况下,但是没有硬性规定,只是一个代码风格问题吧。但是说实话,没想到有什么情况下是返回了 err ,返回值还部分可用的,这种情况一定是函数里面做了两个步骤,然后其中一个步骤的 err 是可以忽略的,那为什么不拆成两个函数呢。
  • 2025/11/7 9:06:00 [ 0 ] [ 0 ] 回复
  • Spring
  • 您输入的密码部分有误(第 1 、3 、4 、6 位错误).
    错误了, 就不应该在给出部分正确的信息, 除非这个错误本身就是可接受的, 比如同时向 100 个 API 推送消息, 但有个别 API 失败了这种场景(不影响主流程的).
    大家有共识, 也不算问题.
  • 2025/11/7 9:04:00 [ 0 ] [ 0 ] 回复
  • 荒岛初冬
  • 参考官方的设计意图:
    https://go.dev/blog/errors-are-values
    https://go.dev/blog/go1.13-errors
    我补充一点个人理解:
    Golang 语境中的错误 error 是一种可以预期的行为,预期之外的叫 Panic (对应其他编程语言中的 Exception )。
    基于这种思想,Golang 中的错误处理有两个特点:
    第一个特点就是上面两篇官方文档提到的,错误是值,使用这个值的方式是 wrap/unwrap ;
    第二个特点是 Golang 主张显式控制流,所有的错误都应该按照调用链传播,并在恰当的位置进行处理。
    这里“处理”的含义是停止传播,即忽略也是一种处理方式。
  • 2025/11/7 9:03:00 [ 0 ] [ 0 ] 回复
  • 烂好人i
  • 从程序流程角度看,发生错误之后,程序会进入错误处理流程,即使部分结果可用意义也不大了,除非你在错误处理流程中做正常的业务逻辑处理,一般不会这么做,也不推荐。
  • 2025/11/7 9:00:00 [ 0 ] [ 0 ] 回复
  • 昨日情书
  • 看起来是很正常的需求,没必要自定义 error,在一个有很多步骤的逻辑中,虽然中间某一步骤报错,但是仍然根据返回的可用值继续进行,这个操作没啥毛病,go 语言挺自由的,没有那么多严格规范!
  • 2025/11/7 8:58:00 [ 0 ] [ 0 ] 回复
  • 陪着我走
  • 你需要的是把数据包装到错误中。
    ```go
    type MyErr struct {
    value int
    }
    
    func (err *MyErr) Error() string {
    return "MyErr"
    }
    
    func test(a int) (int, error) {
    if a%2 == 0 {
    return a, nil
    }
    return 0, &MyErr{value: a}
    
    }
    func main() {
    _, err := test(1)
    if err != nil && err.Error() =="MyErr"{
    fmt.Printf("error %d\n",err.(*MyErr).value);
    }
    }

  • 2025/11/7 8:54:00 [ 0 ] [ 0 ] 回复
  • 清醒纪年
  • // Write writes len(b) bytes from b to the File.
    // It returns the number of bytes written and an error, if any.
    // Write returns a non-nil error when n != len(b).
    func (f *File) Write(b []byte) (n int, err error) {
  • 2025/11/7 8:45:00 [ 0 ] [ 0 ] 回复
  • 此去经年
  • 这会造成混乱吧。另外,为什么会出现错误的时候,“值是部分可用”?是函数返回多个值,然后某几个可用吗。那这种情况是不是一个函数揉了太多的东西了,有必要放在一个函数里面返回一堆值吗,把功能拆出来,拆成几个小函数不可以吗。
  • 2025/11/7 8:38:00 [ 0 ] [ 0 ] 回复