实用指南:Go语言入门(21)-错误处理

Go语言允许函数和方法同时返回多个值。按照惯例,函数在返回错误时,最后边的返回值应用来表示错误。调用函数后,应立即检查是否发生错误。

如果没有错误发生,那么返回的错误值为nil。

package main
import (
	"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 main
import (
	"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的动作可以在函数返回前执行。

posted @ 2025-11-05 13:43  yangykaifa  阅读(6)  评论(0)    收藏  举报