Fli*_*mzy 13

DetailedErrorerror
func foo(answer, x, y int) (int, error) {
    if answer == 42 {
        return 100, nil  //!! cannot use nil as type DetailedError in return argument
    }
    return 0, DetailedError{x: x, y: y}
}
DetailedErrorerror
value, err := foo(...)
if err != nil {
    if detailedErr, ok := err.(DetailedError); ok {
        // Do something with the detailed error values
    } else {
        // It's some other error type, behave accordingly
    }
}
DetailedError

它现在似乎不重要,但将来您的代码可能会扩展以包含其他错误检查:

func foo(answer, x, y int) (int, error) {
    cache, err := fetchFromCache(answer, x, y)
    if err != nil {
        return 0, fmt.Errorf("Failed to read cache: %s", err)
    }
    // ... 
}
DetailedErrorerror
DetailedError
func fooWrapper(answer, x, y int) (int, error) {
    // Do something before calling foo
    result, err := foo(answer, x, y)
    if err != nil {
        return 0, err
    }
    // Do something after calling foo
    return result, nil
}
error

利用这一点,不要绕过它.

即使您的代码永远不会更改,为每个函数或用例创建新的自定义错误类型也是不可持续的,并且使您的代码无法读取且无法推理.