为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Go

课程名称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. 提取统一错误处理方式,业务处理函数不用管错误,直接抛出错误。

图片描述
图片描述

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消