defer
go语言中的defer语句会在其后面跟随的语句进行延迟处理。在defer归属的函数即将返回是,将延迟处理的语句按defer定义的逆序执行,也就是说,先被defer的语句最后被执行,最后被defer的语句,最先被执行。stack,后进先出
特点
- 用于注册延迟调用
- 调用直到return前才被执行,因此可以用做资源清理
- 多个defer 语句,按先进后出的方式执行(stack)
- defer语句中的变量,在defer声明时就决定了
用途
- 关闭文件句柄
- 锁资源释放
- 数据库连接释放
Example
package main import "fmt" func main() { fmt.Println("start") defer fmt.Println("step1") defer fmt.Println("step2") defer fmt.Println("step3") fmt.Println("end") }
init函数
golang有一个特殊的函数init函数,先于main函数执行,实现包级别的一些初始化操作。
初始化顺序:变量初始化—>init()—>main()
特点
- init函数先于main函数自动执行,不能被其他函数调用
- init函数没有输入参数、返回值
- 每个包可以有多个init函数
- 包的每个源文件也可以有多个init函数
- 同一个包的init执行顺序,golang没有明确定义
- 不同包init函数按照包导入的依赖关系来决定执行顺序
指针
Go语言中的函数传参都是值拷贝,当我们想要修改某个变量的时候,我们可以创建一个指向该变量地址的指针变量。传递数据使用指针,而无需拷贝数据。
类型指针不能进行偏移和运算。
Go语言中的指针操作非常简单,只需要记住两个符号:&(取地址)和*(根据地址取值)
语法
一个指针变量指向了一个值的内存地址。(也就是我们声明了一个指针之后,可以像变量赋值一样,把一个值的内存地址放入到指针当中。)
类似于变量和常量,在使用指针前你需要声明指针。指针声明格式如下:
var var_name *var-type var-type:为指针类型;var_name:为指针变量名;*:用于指定变量是作为一个指针。