这是我参与「第五届青训营」笔记创作活动的第6天
基础语法
错误处理
在Golang中,符合语言错误处理的习惯是使用一个单独的返回值来传递错误信息。C++中一般是在函数传入值时,传入传入一个变量(常用bool),如果出现了预料之内的错误,就标记一下这个变量或者提前return之类的方法。如果不同于Java里使用的异常,Go语言的处理方式能够很清晰地知道哪个函数返回了错误,并且能够用简单的if else来处理错误。首先是导入errors包。
import (
"errors"
"fmt"
)
下面是一个简单的例子,声明一个函数,大致作用是从user中查找是否有指定name的user,如果存在,那么返回这个指针,否则返回错误。我们可以在函数的返回值类型里加一个error,这就代表这个函数可能返回错误。在函数实现的时候,如果你需要return,那么你就同时需要return两个值。如果出现错误(下面代码举例),你需要返回nil和用一个error。这个error可以用errors.New创建。如果没有错误,那么就返回原本的结构和一个nil。
type user struct {
name string
password string
}
func findUser(users []user, name string) (v *user, err error) {
for _, u := range users {
if u.name == name {
return &u, nil
}
}
return nil, errors.New("not found")
}
在调用这些返回错误的函数的时候,接收需要写两个变量。
func main(){
u, err := findUser([]user{{"wang", "1024"}}, "wang")
// 调用完之后,你需要判断error是否存在,如果存在,需要处理,例如打印异值退出或者返回函数
if err != nil {
fmt.Println(err)
return
}
// 只有没有error时,你才能去取真正的返回值。否则的话,可能会出现空指针的错误。
fmt.Println(u.name) // wang
if u, err := findUser([]user{{"wang", 1024}}, "li"); err != nil {
fmt.Println(err) // not found
return
} else {
fmt.Println(u.name)
}
}