继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【九月打卡】第6天 go语言错误处理与资源管理

洋溢1310659
关注TA
已关注
手记 26
粉丝 2
获赞 4

课程名称GO开发工程师

课程章节:3-1:defer的调用;3-2:错误处理概念;2-3/4:服务器统一错误处理

课程讲师ccmouse

课程内容
defer:

  • 作用:确保在函数结束时调用
  • 执行顺序:多个defer遵循栈规则, 先进后出
  • 什么时候使用:defer: open/close;lock/unlock;PrintHeader/PrintFooter

defer代码示例

func tryDefer() {
	defer fmt.Println(1)
	defer fmt.Println(2)
	// 即使中间 return 或者 panic 都不会影响defer的输出
	fmt.Println(3) // 3, 2, 1
}

错误处理代码示例

func writeFile(filename string) {
	// os.O_EXCL: used with O_CREATE, file must not exist.
	// 0666: 文件权限,可读可写
	file, err := os.OpenFile(filename, os.O_EXCL|os.O_CREATE, 0666)
	//err = errors.New("custom err"); // 模拟非 *os.PathError类型 的错误
	if err != nil {
		if pathError, ok := err.(*os.PathError); !ok {
			fmt.Println("unknown error", err)
		} else {
			fmt.Println(pathError.Op)
			fmt.Println(pathError.Path)
			fmt.Println(pathError.Error())
		}
		return
	}
	defer file.Close() // open、close匹配
	writer := bufio.NewWriter(file) // 先写入内存,再将内存中的buffer写入文件(加快写入速度)
	defer writer.Flush()
	f := fib.Fibonacci()
	for i := 0; i < 20; i++ {
		fmt.Fprintln(writer, f())
	}
}

统一错误处理函数代码示例:

type appHandler func(writer http.ResponseWriter, request *http.Request) error

// 统一错误处理,http响应函数
func errWrapper(handler appHandler) func(http.ResponseWriter, *http.Request) {
	return func(writer http.ResponseWriter, request *http.Request) {
		err := handler(writer, request)
		if err != nil {
			code := http.StatusOK
			switch {
			case os.IsNotExist(err):
				code = http.StatusNotFound
			default:
				code = http.StatusInternalServerError
			}
			http.Error(writer, http.StatusText(code), code)
		}
	}
}

课程收获

  1. defer的使用可以避免打开文件后忘记进行关闭操作等需要手动处理的操作
  2. 写文件时可以先写入内存,再将内存中的buffer写入文件以加快文件写入速度,避免频繁落盘操作。
  3. 实际项目开发过程中需要多各种可能出现的错误进行异常处理。
  4. 提取统一错误处理方式,业务处理函数不用管错误,直接抛出错误。

图片描述
图片描述

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP