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。

原创文章,作者:RCDWL,如若转载,请注明出处:https://www.beidanyezhu.com/a/28871.html

(0)
RCDWL的头像RCDWL
上一篇 2025-02-01
下一篇 2025-02-01

相关推荐

  • Go语言的重要性

    一、Go 开发者 数量 & 所处地区 全球大约有 110 万名职业 Go 开发者(特指在工作中专门将 Go 作为主力编程语言的群体),如果把主要使用其他编程语言但同时兼职使…

    2025-02-05
  • Go语言与鸭子类型的关系是什么

    Go语言与鸭子类型的关系   先直接来看维基百科里的定义:   If it looks like a duck, swims like a duck, and quacks lik…

  • go语言中函数与方法是什么

      如果你遇到没有函数体的函数声明,表示该函数不是以Go实现的。   package math   func Sin(x float64) float //implemented …

  • Go语言中CGO怎么用

    1. Go语言调用C函数例子: package main   // // 引用的C头文件需要在注释中声明,紧接着注释需要有import &q…

    2025-02-05
  • Go语言能否取代Linux脚本

      在Cloudflare的人们都非常喜欢Go语言。我们在许多内部软件项目以及更大的管道系统中使用它。但是,我们能否进入下一个层次并将其用作我们最喜欢的操作系统Linux的脚本语言…

  • 什么是Go语言的字符串

      一个Go语言字符串是一个任意字节的常量序列。 Go语言字符串与其他语言不同点   Go语言字符串与其他语言(Java,C,Python)字符串的不同点Go语言中字符串的字节使用…

  • 为什么Go语言能够成功

      常言道,历史不会重演,但总会惊人的相似。   如果您想创建一种编程语言,多向那些有经验的人士学习,他们有很多可取之处。在《GoTime》第100期节目中,两位Go语言的创造者R…

  • GO语言的类型有哪些

    1、值的类型给编译器提供两部分信息:一是,需要分配多少内存给这个值(即值的规模);二是这段内存表示什么。 2、用户自定义类型有两种方法。一是使用关键字 struct ,来创建一个结…

    2025-02-05
  • 如何安装和使用Go语言集成开发环境的VS Code

    目录 Go语言集成开发环境之VS Code安装使用 下载与安装 安装中文简体插件 安装Go开发扩展 变更编辑器主题 安装Go语言开发工具包 配置VSCode开启自动保存 配置代码片…

    2025-02-05
  • Go语言的接口的介绍以及作用是什么

    接口就是一系列方法的集合(规范行为) 在面向对象的领域里,接口一般这样定义:接口定义一个对象的行为,规范子类对象的行为。 在 Go 语言中的接口是非侵入式接口(接口没了,不影响代码…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

分享本页
返回顶部