这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
简单记录Go语言学习的学习笔记
defer关键字
Go语言中的延迟执行语句,用来添加函数结束时执行的代码,常用于释放某些已分配的资源、关闭数据库连接、断开socket连接、解锁一个加锁的资源。
关键字 defer 的用法类似于面向对象编程语言 Java 的 finally 语句块,它一般用于释放某些已分配的资源,典型的例子就是对一个互斥解锁,或者关闭一个文件。
以逆序执行(类似栈,即后进先出)
import ( "fmt" )
func main()
{
fmt.Println("Test begin")
defer fmt.Println(1)
defer fmt.Println(2)
defer fmt.Println(3) // 最后一个放入, 位于栈顶, 最先调用
fmt.Println("Test end")
}
结果:
Test begin
Test end
3
2
1
panic关键字
Go语言的类型系统会在编译时捕获很多错误,但有些错误只能在运行时检查,如数组访问越界、空指针引用等,这些运行时错误会引起宕机。
func Test(str string) *Regexp {
regexp, error := Compile(str) //Compile() 是编译正则表达式的入口函数,该函数返回编译好的正则表达式对象和错误。
if error != nil { //判断如果有错,则使用 panic() 触发宕机。
panic(`regexp: Compile(` + quote(str) + `): ` + error.Error())
}
return regexp } //没有错误时返回正则表达式对象。
手动宕机进行报错的方式不是一种偷懒的方式,反而能迅速报错,终止程序继续运行,防止更大的错误产生,不过,如果任何错误都使用宕机处理,也不是一种良好的设计习惯,因此应根据需要来决定是否使用宕机进行报错。
当 panic() 触发的宕机发生时,panic() 后面的代码将不会被运行,但是在 panic() 函数前面已经运行过的 defer 语句依然会在宕机发生时发生作用。
package main
import "fmt"
func main() {
defer fmt.Println("宕机后要做的事情1")
defer fmt.Println("宕机后要做的事情2") //延迟了 2 个语句
panic("宕机") //发生宕机
}
结果 宕机后要做的事情2 宕机后要做的事情1 panic: 宕机
解释:宕机前,defer 语句会被优先执行,由于第 2 个的 defer 后执行,因此会在宕机前,这个 defer 会优先处理,随后才是第 1 个的 defer 对应的语句,这个特性可以用来在宕机发生前进行宕机信息处理。