一、前言
写这个,是为了在之后的工作学习中,更好的应用和更好的理解。
许多时候,学和用是有一定的时间差,因此,好记忆不如烂笔头。
而且,随着自己的使用越来越多,理解也会越来越深刻。
不知道是谁曾说的“记住它在哪里使用过(我好像在哪里见过你)”。这句话的意思是,传递指针,比传递值能够减缓秃头的趋势。
二、难点目录(持续更新)
1. defer关键字 参考《Go语言程序设计》5.8 延迟函数的调用
1. defer关键字
defer的理解:
- ①语义理解:中文翻译为 推迟 延期 延迟
- ②语法类比:相当于其他语言的 try.....finally...
- ③基本原理:当做一个FILO(先进后出)语法/代码栈
- ④使用场景:成对的操作, 如 打开/关闭,连接/断开,加锁/解锁。调试复杂的函数
- ⑤实际案例:
package main
import(
"fmt"
)
func myDefer() (r int) {
r = 1
j := 1
defer func(x int) {
x++ // 函数参数 x 在定义时确定
fmt.Printf("x is %v \n", x) // equal 2
r++ // 外部变量 r 在运行时定义
fmt.Printf("r is %v \n", r) // equal 3
}(j)
j = 2
r = 2
return // 将返回3
}
func main(){
fmt.Printf("myDefer() = %v ", myDefer())
}
package main
import(
"fmt"
"sync"
)
var mutex sync.Mutex
var wg sync.WaitGroup
var count = 0
func main(){
N := 10
for i:=0;i<N;i++{
wg.Add(1)
go increment()
}
wg.Wait() // 我等你们加完
fmt.Printf("count = %d, N = %d \n", count, N) // equal N
}
func increment() {
defer wg.Done() // 这种写法好在,不用写着代码,写着写着就忘了后续操作
mutex.Lock()
defer mutex.Unlock()
count++
//wg.Done()
}
网友评论