错误类型是接口类型。错误变量表示可以将自身描述为字符串的任何值。这是接口的声明:
type error interface {
Error() string
}
最常用的错误实现是errors包未导出的errorString类型:
// errorString is a trivial implementation of error.
type errorString struct {
s string
}
func (e *errorString) Error() string {
return e.s
}
查看此工作代码输出 (The Go Playground):
package main
import (
"errors"
"fmt"
"io"
)
func main() {
err1 := fmt.Errorf("Error")
err2 := errors.New("Error")
err3 := io.EOF
fmt.Println(err1) //Error
fmt.Printf("%#v\n", err1) // &errors.errorString{s:"Error"}
fmt.Printf("%#v\n", err2) // &errors.errorString{s:"Error"}
fmt.Printf("%#v\n", err3) // &errors.errorString{s:"EOF"}
}
输出:
Error
&errors.errorString{s:"Error"}
&errors.errorString{s:"Error"}
&errors.errorString{s:"EOF"}
另见:Comparison operators
比较运算符比较两个操作数并产生一个无类型的布尔值
价值。在任何比较中,第一个操作数必须可分配给
第二个操作数的类型,反之亦然。
相等运算符 == 和 != 适用于
可比。
指针值是可比较的。如果两个指针值相等
指向同一个变量,或者如果两者的值都为零。指向的指针
不同的零大小变量可能相等也可能不相等。
接口值具有可比性。两个接口值相等,如果
它们具有相同的动态类型和相同的动态值,或者如果两者都有
值为零。
非接口类型 X 的值 x 和接口类型 T 的值 t
当类型 X 的值是可比较的并且 X 实现时是可比较的
T. 如果 t 的动态类型与 X 和 t 相同,则它们相等
动态值等于 x。
如果结构值的所有字段都是可比较的,则结构值是可比较的。二
如果相应的非空白字段是,则结构值相等
相等。
所以:
1- 你可以使用Error(),就像这个工作代码(The Go Playground):
package main
import (
"errors"
"fmt"
)
func main() {
err1 := errors.New("Token is expired")
err2 := errors.New("Token is expired")
if err1.Error() == err2.Error() {
fmt.Println(err1.Error() == err2.Error()) // true
}
}
输出:
true
2- 您也可以将其与nil 进行比较,例如这个工作代码 (The Go Playground):
package main
import (
"errors"
"fmt"
)
func main() {
err1 := errors.New("Token is expired")
err2 := errors.New("Token is expired")
if err1 != nil {
fmt.Println(err1 == err2) // false
}
}
输出:
false
3- 您也可以将其与完全相同的错误进行比较,例如此工作代码
(The Go Playground):
package main
import (
"fmt"
"io"
)
func main() {
err1 := io.EOF
if err1 == io.EOF {
fmt.Println("err1 is : ", err1)
}
}
输出:
err1 is : EOF
参考:https://blog.golang.org/error-handling-and-go