6.延迟
defer关键字表示延迟,一条延迟语句将推迟一个函数的执行,直到其所在的函数返回。
被延迟调用的参数会立即被计算,但函数调用不会执行,直到所在的函数返回。 延迟是堆叠在栈中的,后进先出。 什么是栈?有一个经典的笑话:
有一个程序员开了一家客栈,一天来了很多顾客,但是先来的顾客等了好久都没吃到饭,而后来的顾客的菜居然已经上齐了,先来的顾客勃然大怒,问道:“你们这是怎么回事?为什么后来的顾客先吃到饭?”前程序员老板回答道:“不好意思先生,我们这里是客栈呢。”
- package main
- import "fmt"
- func main() {
- fmt.Println("counting")
- for i := 0; i < 10; i++ {
- defer fmt.Println(i)
- }
- fmt.Println("done")
- }
复制代码这样输出的结果是: - counting
- done
- 9
- 8
- 7
- 6
- 5
- 4
- 3
- 2
- 1
- 0
复制代码 7.指针先前的内容里提到过指针,就不详细讲了,下面内容来自JetBrainsAcademy: Go 语言有指针。指针保存一个值的内存地址。 类型 *T 是一个指向 T 值的指针。它的零值是 nil。 var p *int & 操作符生成其操作数的指针。 i := 42p = &i * 操作符表示指针指向的底层值。 fmt.Println(*p) // 通过指针 p 读取 i*p = 21 // 通过指针 p 设置 i 这被称为“解引用”或“间接引用”。 与 C 不同,Go 没有指针运算。 - package main
- import "fmt"
- func main() {
- i, j := 42, 2701
- p := &i // point to i
- fmt.Println(*p) // read i through the pointer
- *p = 21 // set i through the pointer
- fmt.Println(i) // see the new value of i
- p = &j // point to j
- *p = *p / 37 // divide j through the pointer
- fmt.Println(j) // see the new value of j
- }
复制代码输出:
|