go语言中如何使用闭包函数

今天就跟大家聊聊有关go语言中如何使用闭包函数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

创新互联建站长期为千余家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为琼海企业提供专业的成都网站设计、做网站,琼海网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。

一、以前用闭包函数都是为了写起来省事,最近试着学学go,发现go里面的闭包函数挺怪,例如下面的代码:

package main
import "fmt"
func main() {
    var list []func() int
    for i := 0; i < 3; i++ {
        list = append(list, func() int {
            return i
        })
    }
    for _, fun := range list {
        fmt.Printf("%v", fun())
    }
}

感觉好像应该输出 0 1 2 ,而实际上会输出  3 3 3 。

我是这样理解的:

1、在添加函数切片的for循环中,只是添加了函数,但函数并未执行,若执行,需要在函数后加(),同时函数编译到内存中的空间是固定的,所以函数的地址应该也是固定的,也就是说是同一个函数。

2、i变量虽然是在for中的,但是由于匿名函数也在for中,所以匿名函数是可以使用i变量的,实际测试,函数中i变量的地址也确实是for循环中i变量的地址。

3、第一个for循环退出之前,是运行了3次i++,所以最后i变量的值是3。

4、第二个for循环运行函数,函数中的i变量是3,自然输出3。

匿名函数确实有点绕。

二、go简易教程中的一个例子说明

package main

import "fmt"

func getSequence() func() int {
   i:=0
   return func() int {
      i+=1
     return i  
   }
}

func main(){
   /* nextNumber 为一个函数,函数 i 为 0 */
   nextNumber := getSequence()  

   /* 调用 nextNumber 函数,i 变量自增 1 并返回 */
   fmt.Println(nextNumber())
   fmt.Println(nextNumber())
   fmt.Println(nextNumber())
   
   /* 创建新的函数 nextNumber1,并查看结果 */
   nextNumber1 := getSequence()  
   fmt.Println(nextNumber1())
   fmt.Println(nextNumber1())
}

我的理解,函数getSequence的返回值是匿名函数func() int,i:=0  是属于getSequence 函数的变量,所以当nextNumber := getSequence() 后,这个这是就归属于nextNumber,而nextNumber()运行的是getSequence的匿名函数func() int,所以i变量的值在nextNumber里是一直保留着的,会随着匿名函数运行一次加1。

看完上述内容,你们对go语言中如何使用闭包函数有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。


名称栏目:go语言中如何使用闭包函数
分享网址:http://scyanting.com/article/jhjiji.html