我有当控制台打印错误对象给了我Token is expired
如何比较Golang错误对象
我如何可以与特定的误差值进行比较。我试过但没有工作。
if(err == errors.New("Token is expired")){
log.Printf("Unauthorised: %s\n", err)
}
我有当控制台打印错误对象给了我Token is expired
如何比较Golang错误对象
我如何可以与特定的误差值进行比较。我试过但没有工作。
if(err == errors.New("Token is expired")){
log.Printf("Unauthorised: %s\n", err)
}
尝试
err.Error() == "Token is expired"
或实现错误界面创建自己的错误。
错误类型是接口类型。一个错误变量表示可以将自己描述为一个字符串的任何值。下面是接口的声明:
type error interface {
Error() string
}
最常用的错误执行是错误包的未导出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"}
比较运算符比较两个操作数,得到一种无类型的布尔 值。在任何比较中,第一个操作数必须可分配给第二个操作数的 类型,反之亦然。
等于运算符
==
和!=
适用于与 相当的操作数。指针值是可比较的。如果指针 指向相同的变量或两者的值均为零,则两个指针值相等。指向 的不同的零大小的变量可能相等,也可能不相等。
接口值是可比的。如果 它们具有相同的动态类型和相同的动态值,或者两个 的值均为零,则两个接口值相等。
非接口类型X的值x和接口类型T 的值t是当X型的值是可比较的可比较的和X实现 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
库中的定义错误值
package fruits
var NoMorePumpkins = errors.New("No more pumpkins")
不要在代码的任何地方创建errors.New
错误,但返回预定值,每当发生错误,然后您可以执行以下操作:
package shop
if err == fruits.NoMorePumpkins {
...
}
请参阅io
包错误供参考。
另一个缺点是另一个软件包可能会覆盖导出的'NoMorePumpkins'变量的值。如果有一种方法可以用'const' – captncraig
@captncraig来做到这一点,那么你可以使用getter函数 –
@WingerSendon好点。这可能是我最喜欢的解决方案。 – captncraig
软件包可以导出他们使用的错误变量,以便其他人可以与它们进行比较。例如,如果从名为MYPKG产品包装中附带的错误,被定义为var ErrTokenExpired Error = errors.New("Token is expired")
那么你可以做:
if err == myPkg.ErrTokenExpired {
log.Printf("Unauthorised: %s\n", err)
}
如果错误来自第三方软件包,并且不使用导出错误的变量然后你可以做的只是比较你从err.Error得到的字符串()
比比较字符串好很多。 – middlehut
我会避免使用接受的方法。查看DαveCheney关于错误处理https://www.youtube.com/watch?v=lsBF58Q-DnY的演示文稿。我一定会回答你的问题。 – s7anley