Go语言基础6 | 青训营笔记

73 阅读2分钟

这是我参与「第五届青训营」笔记创作活动的第6天

基础语法

错误处理

在Golang中,符合语言错误处理的习惯是使用一个单独的返回值来传递错误信息。C++中一般是在函数传入值时,传入传入一个变量(常用bool),如果出现了预料之内的错误,就标记一下这个变量或者提前return之类的方法。如果不同于Java里使用的异常,Go语言的处理方式能够很清晰地知道哪个函数返回了错误,并且能够用简单的if else来处理错误。首先是导入errors包。

import (
    "errors"
    "fmt"
)

下面是一个简单的例子,声明一个函数,大致作用是从user中查找是否有指定nameuser,如果存在,那么返回这个指针,否则返回错误。我们可以在函数的返回值类型里加一个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)
    }
}