Go语言入门(21)-错误处理
Go语言允许函数和方法同时返回多个值。按照惯例,函数在返回错误时,最后边的返回值应用来表示错误。调用函数后,应立即检查是否发生错误。
如果没有错误发生,那么返回的错误值为nil。
package mainimport ("fmt""os"
)func main() {//"." 是一个标准的表示法,代表当前目录,即程序运行时所在的目录.//当你传递 "." 给 ioutil.ReadDir() 时,函数会读取当前工作目录中的所有文件和子目录。files, err := ioutil.ReadDir("../")if err != nil {fmt.Println(err)os.Exit(1)}for _, file := range files {fmt.Println(file.Name())}
}
那如何优雅地进行错误处理/减少错误处理代码呢?有一种策略是:将程序中不会出错地部分和包含潜在错误隐患地部分隔离开来。对于不得不返回错误地代码,应尽力简化相应地错误处理代码。
再写入文件时,可能会出错,例如:路径不正确、权限不够、磁盘空间不够等。。。
文件写入完毕后,必须被关闭,确保文件被刷到磁盘上,避免资源的泄露。下面看一个例子
package mainimport ("fmt""os"
)// 文件写入👇
func proverbs(name string) error {f, err := os.Create(name)if err != nil {return err}defer f.Close() //defer关键字,可确保所有被defer的动作可以在函数返回前执行。_, err = fmt.Fprintln(f, "Errors are values.")if err != nil {//有defer,就可以注释掉下方的语句//f.Close() //文件写入完毕后,必须被关闭,确保文件被刷到磁盘上,避免资源泄露。return err}_, err = fmt.Fprintln(f, "Don't just check errors,handle them gracefully.")f.Close() //有defer,就可以注释该语句return err
}//文件写入👆func main() {// 文件写入👇err := proverbs("proverbs23.txt")if err != nil {fmt.Println(err)os.Exit(1)}//文件写入👆}
defer关键字:
上述例程中用到了defer(),它是Go语言中关键字的一种,可以确保所有deferred的动作可以在函数返回前执行。