gpt4 book ai didi

举例讲解Go语言中函数的闭包使用

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章举例讲解Go语言中函数的闭包使用由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

和变量的声明不同,Go语言不能在函数里声明另外一个函数。所以在Go的源文件里,函数声明都是出现在最外层的.

“声明”就是把一种类型的变量和一个名字联系起来.

Go里有函数类型的变量,这样,虽然不能在一个函数里直接声明另一个函数,但是可以在一个函数中声明一个函数类型的变量,此时的函数称为闭包(closure).

例:

  。

复制代码 代码如下:

  。

packagemain   import"fmt"   funcmain(){     add:=func(baseint)func(int)(int){         returnfunc(iint)(int){             returnbase+i         }     }         add5:=add(5)     fmt.Println("add5(10)=",add5(10)) } 。

  。

  。

  。

这个例子唯一的使用价值大概就是用来展示闭包的构建和使用.

add是一个闭包,因为它是无名的函数类型的变量。可以认为它是一个闭包作坊,根据入参返回(生产)一个闭包。这样add5就是使用5作为add的参数得到的一个闭包.

闭包的声明是在另一个函数的内部,形成嵌套。和块的嵌套一样,内层的变量可以遮盖同名的外层的变量,而且外层变量可以直接在内层使用。如add的base参数在return返回的闭包的外层,所以它的值5在add返回并赋值给add5后依旧存在。当add5执行时,参数i可以从这个外层得到的base相加,得到结果15. 。

个人理解:

其实理解闭包的最方便的方法就是将闭包函数看成一个类,一个闭包函数调用就是实例化一个类.

然后就可以根据类的角度看出哪些是“全局变量”,哪些是“局部变量”了.

比如上例中的adder函数返回func(int) int 的函数 。

pos和neg分别实例化了两个“闭包类”,在这个“闭包类”中有个“闭包全局变量”sum。所以这样就很好理解返回的结果了.

再来看下面一个例子:

  。

复制代码 代码如下:

package main 。

  。

import "fmt" 。

func adder() func(int) int {      sum := 0      return func(x int) int {           sum += x           return sum      } } 。

func main() {      pos, neg := adder(), adder()      for i := 0; i < 10; i++ {           fmt.Println(                pos(i),                neg(-2*i),           )      } } 。

  。

  。

运行返回结果:

?
1
2
3
4
5
6
7
8
9
10
0 0
1 -2
3 -6
6 -12
10 -20
15 -30
21 -42
28 -56
36 -72
45 -90

这个就是Go中的闭包,一个函数和与其相关的引用环境组合而成的实体.

最后此篇关于举例讲解Go语言中函数的闭包使用的文章就讲到这里了,如果你想了解更多关于举例讲解Go语言中函数的闭包使用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com