一尘不染

推迟使用说明

go

假设我有以下功能

func printNumbers(){
 var x int

 defer fmt.Println(x)

 for i := 0; i < 5; i++{
  x++
 }
}

规范中所述:

每次执行“ defer”语句时,将照常评估调用的函数值和参数并重新保存,但不会调用实际函数。

显然,函数执行结束时将输出零。但是,如果我想打印出变量的最终值该x怎么办?

我提出了以下解决方案:

func printNumbers(){
  var x int

  printVal := func(){
    fmt.Println(x)
  }

  defer printVal()

  for i := 0; i < 5; i++{
    x++
  }
}

所以我想知道是否有更好的方法来解决此问题。


阅读 200

收藏
2020-07-02

共1个答案

一尘不染

如果defer有参数,则在defer语句的行对其进行评估;以下代码段对此进行了说明,其中defer将显示0:

func printNumber() {
   i := 0
   defer fmt.Println(i) // will print 0
   i++
   return
}

如果要将语句或函数的执行推迟到封闭(调用)函数结束之前,可以将匿名函数用作延迟语句。这是一个更新的示例:

func printNumbers() {
    x := 0
    defer func() { fmt.Println(x) }()
    for i:=0; i < 5; i++ {
        x++;
    }
    return
}

http://play.golang.org/p/YQGQ_8a0_9

2020-07-02