zoukankan      html  css  js  c++  java
  • golang的闭包和普通函数调用区别

    先看一段程序

    package main


    import (
      "fmt"
    )

     func main() {
       a := []int{1, 2, 3}
       for _, i := range a {
         fmt.Println(i)
         defer p(i)
       }
     }
     
     func p(i int) {
      fmt.Println(i)
     }

    运行这段程序,输出结果为

    1

    2

    3

    3

    2

    1

    这里就是普通的函数调用,每次调用func p时,完成 i 的值复制,然后打印,此时 i 值复制了3次,分别是1,2,3。由于defer是后进先出,所以执行变成3,2,1

    下面我我们用闭包改写下程序:

    package main

    import (
      "fmt"
    )

    func main() {
      a := []int{1, 2, 3}
      for _, i := range a {
        fmt.Println(i)
        defer func() {
           fmt.Println(i)
        }()
        }
    }

    运行这段程序,输出结果为

    1

    2

    3

    3

    3

    3

    这个就是闭包的“神奇”之处。闭包里的非传递参数外部变量值是传引用的,在闭包函数里那个i就是外部非闭包函数自己的参数,所以是相当于引用了外部的变量, i 的值执行到第三次是3 ,闭包是地址引用所以打印了3次i地址指向的值,所以是3,3,3

  • 相关阅读:
    浏览器版本过低
    虚拟PWN初探
    elasticsearch常用查询
    python安装pip模块
    spark-kafka-es交互 优化
    scala写文件
    python unittest
    scala collection(集合)
    spark-kafka-es交互
    scala语法
  • 原文地址:https://www.cnblogs.com/liangDream/p/3905055.html
Copyright © 2011-2022 走看看