Go语言-闭包

hittata · · 1481 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

转载http://blog.sina.com.cn/s/blog_487109d101018fcx.html 略做加工

在找“闭包”的资料时找到这个:

http://www.cnblogs.com/Jifangliang/archive/2008/08/05/1260602.html

这里解说得很清楚明了,例子也很间单。

闭包是“函数”和“引用环境”组成的整体。

在这里用Go重写一下他的例子:

package main

import "fmt"

func ExFunc(n int) func() {

    sum:=n

    a:=func () {          //把匿名函数作为值赋给变量a (Go 不允许函数嵌套。

                          //然而你可以利用匿名函数实现函数嵌套)

    fmt.Println(sum+1)    //调用本函数外的变量

    }                     //这里没有()匿名函数不会马上执行

    return a

}

 

func main() {

myFunc:=ExFunc(10)

myFunc()

myAnotherFunc:=ExFunc(20)

myAnotherFunc()

 

myFunc()

myAnotherFunc()

}

 

 

这个函数还有另一个写法:

func ExFunc(n int) func() {

    sum:=n

    return func () {    //直接在返回处的匿名函数

    fmt.Println(sum+1)

    }

}

 

另一个例子:

package main

import "fmt"

func ExFunc(n int) func() {

    return func() {

    n++ //这里对外部变量加1

    fmt.Println(n)

    }

}

 

func main() {

    myFunc := ExFunc(10)

    myFunc()         //这里输出11

    myAnotherFunc := ExFunc(20)

    myAnotherFunc()  //这里输出21

    myFunc() //12

    myAnotherFunc()//22

//再一次调用myFunc()函数,结果是12,由此得出以下两点

//1.内函数对外函数的变量的修改,是对变量的引用

//2.变量被引用后,它所在的函数结束,这变量也不会马上被销毁,引用变量和产生的函数变量的生命期是一致的

}

 

 

package main

 

import (

  "fmt"

)

 

func adder() func(int) int {

  sum := 0

  innerfunc := func(x int) int {

    sum += x

    return sum

  }

  return innerfunc

}

 

func main() {

  pos, neg := adder(), adder()

  for i := 0; i < 10; i++ {

    fmt.Println(pos(i), neg(-2*i))

  }

 

}

结果:说明闭包对外部环境是采用引用方式,匿名函数的每次调用都产生一个环境;与上一个示例的区别是这里引入了外层函数的闭包变量:sum,调用多次adder(),每调用一次:adder()就产生一个闭包环境:sum 和匿名函数,多次调用闭包函数,共享sum;每次adder()调用产生的闭包环境相互隔离;

0 0

1 -2

3 -6

6 -12

10 -20

15 -30

21 -42

28 -56

36 -72

45 -90

 

 


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:hittata

查看原文:Go语言-闭包

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1481 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传