教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Go语言-闭包

Go语言-闭包

发布时间:2023-02-08   编辑:jiaochengji.com
教程集为您提供Go语言-闭包等资源,欢迎您收藏本站,我们将为您提供最新的Go语言-闭包资源

转载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

 

 


到此这篇关于“Go语言-闭包”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
2018年最全Go语言教程零基础入门到进阶实战视频
Golang中闭包的实现原理
Go语言发展历史、核心、特性及学习路线
go语言和python哪个难
想系统学习GO语言(Golang
Go 语言十年而立,Go2 蓄势待发
1.1Go语言简要介绍
go 语言学习历程
初识 go 语言:方法,接口及并发
Go语言的函数、方法和接口

[关闭]
~ ~