19年第35周:Go语言 不易懂的特殊标识符 如defer

2019-08-25  本文已影响0人  习惯研究所所长

一、前言

写这个,是为了在之后的工作学习中,更好的应用和更好的理解。
许多时候,学和用是有一定的时间差,因此,好记忆不如烂笔头。
而且,随着自己的使用越来越多,理解也会越来越深刻。
不知道是谁曾说的“记住它在哪里使用过(我好像在哪里见过你)”。这句话的意思是,传递指针,比传递值能够减缓秃头的趋势。


二、难点目录(持续更新)

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()
}
上一篇 下一篇

猜你喜欢

热点阅读