美文网首页
defer 的几个例子

defer 的几个例子

作者: 哈哈笑321 | 来源:发表于2019-06-10 19:36 被阅读0次

defer 每次执行时,Go 语言会把它携带的 defer 函数及其参数值另行存储到一个栈(FILO)。

    for i := 0; i < 3; i++ {
        defer fmt.Printf("defer in  for [%d]\n", i)
    }

defer 调用了函数 fmt.Printf,其中 i 作为参数传入,会进行值拷贝,因此输出:

defer in  for [2]
defer in  for [1]
defer in  for [0]
    for i := 0; i < 3; i++ {
        defer func() {
            fmt.Printf("defer in  for [%d]\n", i)
        }()
    }

defer 调用无参函数 func,且引用了外部变量 i,因此是闭包,那么会将 i 的地址传进函数。循环执行完毕时,i 已经变为 3,因此输出为:

defer in  for [3]
defer in  for [3]
defer in  for [3]
    for i := 0; i < 3; i++ {
        defer func(i2 int) {
            fmt.Printf("defer in  for [%d]\n", i2)
        }(i)
    }

将 i 作为参数传入函数,因此也会进行值拷贝,结果与示例一相同。

    for i := 0; i < 3; i++ {
        go func() {
            defer fmt.Printf("defer in  for [%d]\n", i)
        }()
    }

    time.Sleep(time.Millisecond * 100)

由于 sleep 了一会,与示例二结果一样。

  • 参考:

郝林老师的专栏:Go语言核心36讲

相关文章

  • defer 的几个例子

    defer 每次执行时,Go 语言会把它携带的 defer 函数及其参数值另行存储到一个栈(FILO)。 示例一:...

  • Golang研学:如何掌握并用好defer(延迟执行)

    defer:在函数A内用defer关键字调用的函数B会在在函数A return后执行。 先看一个基础的例子,了解一...

  • 第二章html中使用JavaScript