Day9:《Go 语言入门指南:基础语法和常用特性解析-9》
defer
1.defer是什么?
先说结论:defer是一个关键字,用于指定在函数执行完毕之前延迟执行一段代码块。defer通常用于确保在函数返回之前执行一些清理操作或释放资源的任务。
关键字 defer 允许我们推迟到函数返回之前(或任意位置执行 return 语句之后)一刻才执行某个语句或函数(为什么要在返回之后才执行这些语句?因为 return 语句同样可以包含一些操作,而不是单纯地返回某个值)。
2.类似于java中的finally
关键字 defer 的用法类似于面向对象编程语言 Java 的finally 语句块,一般用于释放某些已分配的资源。
今天的学习就到这里啦,明天再见~
3.当有多个 defer 行为被注册时,它们会以逆序执行(类似栈,即后进先出):
例如:
func f() {
for i := 0; i < 5; i++ {
defer fmt.Printf("%d ", i)
}
}
输出: 4 3 2 1 0
4.defer的主要用法:
①关键字 defer 允许我们进行一些函数执行完成后的收尾工作,例如:defer file.Close() 关闭文件流
②解锁一个加锁的资源,
mu.Lock()
defer mu.Unlock()
③关闭数据库链接
defer disconnectFromDB()
④追踪打印
一个基础但十分实用的实现代码执行追踪的方案就是在进入和离开某个函数打印相关的消息。
此外,还可以打印记录函数的参数和返回值。
内置函数
Go 语言拥有一些不需要进行导入操作就可以使用的内置函数。它们有时可以针对不同的类型进行操作,例如:len()、cap() 和 append(),或必须用于系统级的操作,例如:panic()。因此,它们需要直接获得编译器的支持。
以下是一个简单的列表用于记录内置函数:
| close() | 用于管道通信 |
|---|---|
| len()、cap() | len() 用于返回某个类型的长度或数量(字符串、数组、切片、map 和管道);cap() 是容量的意思,用于返回某个类型的最大容量(只能用于数组、切片和管道,不能用于 map) |
| new()、make() | new() 和 make() 均是用于分配内存:new() 用于值类型和用户定义的类型,如自定义结构,make 用于内置引用类型(切片、map 和管道)。它们的用法就像是函数,但是将类型作为参数:new(type)、make(type)。new(T) 分配类型 T 的零值并返回其地址,也就是指向类型 T 的指针。它也可以被用于基本类型:v := new(int)。make(T) 返回类型 T 的初始化之后的值,因此它比 new() 进行更多的工作。new() 是一个函数,不要忘记它的括号。 |
| copy()、append() | 用于复制和连接切片 |
| panic()、recover() | 两者均用于错误处理机制 |
| print()、println() | 底层打印函数,在部署环境中建议使用 fmt 包 |
| complex()、real ()、imag() | 用于创建和操作复数 |