go 相关


defer

defer 设计目的是更好的执行收尾工作

  1. defer 的参数是调用时就决定的
1
2
3
4
5
6
func a() {
    i := 0
    defer fmt.Println(i)
    i++
    return
}

这段代码中 i 会打印 0

  1. defer 函数在周围函数返回后,以先进后出的顺序返回
1
2
3
4
5
func b() {
    for i := 0; i < 4; i++ {
        defer fmt.Print(i)
    }
}

打印 3210

  1. defer 函数可以读取并赋值给周围函数的命名变量
1
2
3
4
func c() (i int) {
    defer func() { i++ }()
    return 1
}

将返回 2

panic

panic 是一个内置函数,可以停止常规控制流并开始恐慌。
当函数 F 调用 panic 时,F 停止执行,F 的 defer 函数列表正常执行,然后 F 返回到它的调用者处。对调用者而言,F 表现得像一个 对 panic 的调用。然后进程继续执行堆栈直到这个 goroutine 中的所有函数都返回,此时程序崩溃。
panic 可以直接调用来引发 panic,也能通过运行时错误引起。

recover

recover 是一个内置函数,可以重新获得对 panic goroutine 的控制。
recover 只在 defer 内有作用,在正常函数中执行会返回 nil 并且没有其他效果。如果当前 goroutine 正在 panicking,调用 recover 会捕获传递给 panic 的值并返回正常执行流程。

函数中需要注意传入的是外部变量还是内部变量(值拷贝)

Go 语言中没有继承,只有组合

defer 入参调用的函数是按正常顺序执行

Map 是并发读写不安全的

Using Hugo & Soda theme
fc4soda ❤ 2018.04.24~