Skip to content

Commit 47efdab

Browse files
committed
添加defer 语句实例
1 parent 46002f2 commit 47efdab

File tree

2 files changed

+71
-1
lines changed

2 files changed

+71
-1
lines changed

README.md

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1808,7 +1808,7 @@ func main() {
18081808
18091809
if 的便捷语句定义的变量同样可以在任何对应的 else 块中使用。
18101810
1811-
**switch 的执行顺序:**条件从上到下的执行,当匹配成功的时候停止。
1811+
**switch 的执行顺序:** 条件从上到下的执行,当匹配成功的时候停止。
18121812
18131813
```go
18141814
package main
@@ -1855,6 +1855,43 @@ func main() {
18551855
18561856
</details>
18571857
1858+
<details>
1859+
<summary>defer 语句</summary>
1860+
1861+
```go
1862+
package main
1863+
import "fmt"
1864+
func main() {
1865+
// 2. 在输出 world
1866+
defer fmt.Println("world")
1867+
// 1. 先输出 hello
1868+
fmt.Println("hello")
1869+
}
1870+
```
1871+
1872+
> defer 语句会延迟函数的执行直到上层函数返回。
1873+
> 延迟调用的参数会立刻生成,但是在上层函数返回前函数都不会被调用。
1874+
1875+
**defer 栈**
1876+
1877+
延迟的函数调用被压入一个栈中。当函数返回时, 会按照后进先出的顺序调用被延迟的函数调用。
1878+
1879+
```go
1880+
package main
1881+
import "fmt"
1882+
func main() {
1883+
fmt.Println("counting")
1884+
for i := 0; i < 10; i++ {
1885+
defer fmt.Println(i)
1886+
}
1887+
fmt.Println("done")
1888+
}
1889+
```
1890+
1891+
可以运行demo [defer](example/defer/defer.go) 查看效果。
1892+
1893+
</details>
1894+
18581895
## 资源导航
18591896
18601897
<details>

example/defer/defer.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package main
2+
import "fmt"
3+
func main() {
4+
// 2. 在输出 world
5+
defer fmt.Println("world")
6+
// 1. 先输出 hello
7+
fmt.Println("hello")
8+
// 输出结果
9+
// =======
10+
// hello
11+
// world
12+
13+
14+
fmt.Println("counting")
15+
for i := 0; i < 10; i++ {
16+
defer fmt.Println(i)
17+
}
18+
fmt.Println("done")
19+
// 输出结果
20+
// =======
21+
// counting
22+
// done
23+
// 9
24+
// 8
25+
// 7
26+
// 6
27+
// 5
28+
// 4
29+
// 3
30+
// 2
31+
// 1
32+
// 0
33+
}

0 commit comments

Comments
 (0)