go笔记 | 青训营

49 阅读2分钟

defer


go语言中的defer语句会在其后面跟随的语句进行延迟处理。在defer归属的函数即将返回是,将延迟处理的语句按defer定义的逆序执行,也就是说,先被defer的语句最后被执行,最后被defer的语句,最先被执行。stack,后进先出

特点

  1. 用于注册延迟调用
  2. 调用直到return前才被执行,因此可以用做资源清理
  3. 多个defer 语句,按先进后出的方式执行(stack)
  4. defer语句中的变量,在defer声明时就决定了

用途

  1. 关闭文件句柄
  2. 锁资源释放
  3. 数据库连接释放

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:为指针变量名;*:用于指定变量是作为一个指针。