Go语言学习笔记(三) | 青训营笔记

117 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第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 对应的语句,这个特性可以用来在宕机发生前进行宕机信息处理。