一尘不染

Go 示例和习语

go

学习这门语言的 Go 代码并不多,而且我确信我不是唯一一个尝试使用它的人。因此,如果您发现有关该语言的有趣信息,请在此处发布示例。

我也在找

  • 在 Go 中做事的惯用方式,
  • C/C++ 思维方式“移植”到 Go,
  • 关于语法的常见陷阱,
  • 任何有趣的事情,真的。

阅读 191

收藏
2021-12-09

共1个答案

一尘不染

推迟声明

“延迟”语句调用一个函数,该函数的执行被推迟到周围函数返回的那一刻。

DeferStmt = “defer” 表达式。

表达式必须是函数或方法调用。每次执行“defer”语句时,都会评估并重新保存函数调用的参数,但不会调用该函数。延迟函数调用在周围函数返回之前立即以 LIFO 顺序执行,但在返回值(如果有)被评估之后。

lock(l);
defer unlock(l);  // unlocking happens before surrounding function returns

// prints 3 2 1 0 before surrounding function returns
for i := 0; i <= 3; i++ {
    defer fmt.Print(i);
}

更新:

defer现在也处理惯用方式panic例外样方式:

package main

import "fmt"

func main() {
    f()
    fmt.Println("Returned normally from f.")
}

func f() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
        }
    }()
    fmt.Println("Calling g.")
    g(0)
    fmt.Println("Returned normally from g.")
}

func g(i int) {
    if i > 3 {
        fmt.Println("Panicking!")
        panic(fmt.Sprintf("%v", i))
    }
    defer fmt.Println("Defer in g", i)
    fmt.Println("Printing in g", i)
    g(i+1)
}
2021-12-09