推迟直接调用函数并在匿名函数中调用它之间的区别?

时间:2017-11-16 03:19:52

标签: go

我得到了这样的代码。

import (
  "fmt"
)

func ShowResult(result []string) {
  fmt.Println(result)
}

func main() {
  result := []string{}
  defer func() {
    ShowResult(result)
  }()
  defer ShowResult(result)
  result = append(result, "test")
}

结果是:

[]
[test]

所以有人能告诉我直接调用函数和在延迟时在匿名函数中调用它有什么区别吗?

1 个答案:

答案 0 :(得分:7)

函数参数在延迟时会被计算。从文档

  

每次执行“延迟”语句时,调用的函数值和参数都会照常计算并重新保存,但不会调用实际函数

当你的延迟函数是一个闭包时,在执行闭包之前不会计算ShowResult参数,这是在外部函数返回之后和result值被修改之后。