特定错误处理时的行为不明确

hey*_*hey 5 go

我正在尝试处理特定的错误,但我对这种行为感到惊讶.

例子:

如果我使用

if err == errors.New("something"){}` 
Run Code Online (Sandbox Code Playgroud)

它会返回true,即使errnil.

如果我使用

if err.String() == "something"` 
Run Code Online (Sandbox Code Playgroud)

它吓坏了errnil.

我真的很期待

err == errors.New("something")` 
Run Code Online (Sandbox Code Playgroud)

工作,我不知道为什么它会返回true.

更多代码:

以下是一些澄清问题的代码(Play):

package main

import "fmt"
import "errors"

func main() {

    e := errors.New("error")
    //I'm expecting this to return true
    if e == errors.New("error") {
        fmt.Println("Hello, playground")
    }
}
Run Code Online (Sandbox Code Playgroud)

jul*_*enc 6

你可以做什么:

  • 比较err.Error():if err != nil && err.Error() == "something"
  • 为您的错误使用全局变量

以下是第二个解决方案的示例:

package my_package

var ErrSmth = errors.New("something")

func f() error {
    return ErrSmth
}
Run Code Online (Sandbox Code Playgroud)
package main

import "my_package"

func main() {
    err := f()
    if err == my_package.ErrSmth {
         // Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

第二种解决方案是使用io包处理特定错误的方式.

  • 扩展@julienc的答案:看看规范中的[比较运算符](http://golang.org/ref/spec#Comparison_operators)."错误"类型是[接口类型](http://golang.org/pkg/builtin/#error).从规范:接口值是可比的.如果两个接口值具有相同的动态类型和相等的动态值,或者两者的值都为nil,则它们相等. (4认同)