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

发布时间:2021-07-28 13:55:17 作者:Leah
来源:亿速云 阅读:195

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

一、以前用闭包函数都是为了写起来省事,最近试着学学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语言中如何使用闭包函数有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

推荐阅读:
  1. go 函数使用,闭包
  2. thinkphp-使用闭包函数

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

go语言

上一篇:SpringMVC注解@initbinder如何解决类型转换问题

下一篇:如何解决"XML Parser Error on line 1: 前言中不允许有内容"错误

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》