Skip to content

Commit 7ccfb9f

Browse files
committed
update lesson19
1 parent 543a1e6 commit 7ccfb9f

File tree

3 files changed

+116
-0
lines changed

3 files changed

+116
-0
lines changed

workspace/lesson19/concurrency1.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package main
2+
3+
import "fmt"
4+
// import "time"
5+
import "sync"
6+
7+
var sum int = 0
8+
var wg sync.WaitGroup
9+
var mutex sync.Mutex
10+
11+
func add() {
12+
defer wg.Done()
13+
mutex.Lock()
14+
sum++
15+
mutex.Unlock()
16+
}
17+
18+
func main() {
19+
N := 100
20+
21+
wg.Add(N)
22+
23+
for i:=0; i<N; i++ {
24+
go add()
25+
}
26+
27+
wg.Wait()
28+
29+
fmt.Println("sum=", sum)
30+
}

workspace/lesson20/defer1.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"sync"
6+
)
7+
8+
9+
var wg sync.WaitGroup
10+
11+
12+
func sumN(N int) {
13+
// 调用defer wg.Done()确保sumN执行完之后,可以对wg的计数器减1
14+
defer wg.Done()
15+
sum := 0
16+
for i:=1; i<=N; i++ {
17+
sum += i
18+
}
19+
fmt.Printf("sum from 1 to %d is %d\n", N, sum)
20+
}
21+
22+
func main() {
23+
// 设置wg跟踪的计数器数量为1
24+
wg.Add(1)
25+
// 开启sumN这个goroutine去计算1到100的和
26+
go sumN(100)
27+
// Wait会一直等待,直到wg的计数器为0
28+
wg.Wait()
29+
30+
fmt.Println("finish")
31+
}

workspace/lesson20/readme.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
## defer关键字
2+
3+
* defer是延迟的意思,在Go里可以放在某个函数或者方法调用的前面,让该函数或方法延迟执行
4+
5+
* 语法:defer本身是在某个函数体内执行,比如在函数A内调用了defer func_name(),只要defer func_name()这行代码被执行到了,那func_name这个函数就会**被延迟到函数A return之前执行,并且一定会执行**
6+
7+
```go
8+
defer func_name([parameter_list])
9+
defer package_name.func_name([parameter_list]) // 例如defer fmt.Println("blabla")
10+
```
11+
12+
* 如果在函数内调用了**多次defer**,那在函数return之前,defer的函数调用满足LIFO原则,先defer的函数后执行,后defer的函数先执行。比如在函数A内先后执行了defer f1(), defer f2(), defer f3(),那函数A return之前,会按照f3(), f2(), f1()的顺序执行,再return。
13+
14+
* defer的用途?
15+
16+
Answer:defer常用于成对的操作,比如文件打开后要关闭,sync.WaitGroup跟踪的goroutine的申请和释放等。为了确保资源被释放,可以结合defer一起使用,避免在代码的各种条件分支里去释放资源,容易遗漏和出错。
17+
18+
* 示例1
19+
20+
```go
21+
package main
22+
23+
import (
24+
"fmt"
25+
"sync"
26+
)
27+
28+
29+
var wg sync.WaitGroup
30+
31+
32+
func sumN(N int) {
33+
// 调用defer wg.Done()确保sumN执行完之后,可以对wg的计数器减1
34+
defer wg.Done()
35+
sum := 0
36+
for i:=1; i<=N; i++ {
37+
sum += i
38+
}
39+
fmt.Printf("sum from 1 to %d is %d\n", N, sum)
40+
}
41+
42+
func main() {
43+
// 设置wg跟踪的计数器数量为1
44+
wg.Add(1)
45+
// 开启sumN这个goroutine去计算1到100的和
46+
go sumN(100)
47+
// Wait会一直等待,直到wg的计数器为0
48+
wg.Wait()
49+
50+
fmt.Println("finish")
51+
}
52+
```
53+
54+
55+

0 commit comments

Comments
 (0)