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

本文主要介绍"go语言中怎么使用闭包函数",希望能够解决您遇到有关问题,下面我们一起来看这篇 "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语言中怎么使用闭包函数" 就介绍到这。希望大家多多支持编程宝库

Golang中strings如何使用:本文主要介绍"Golang中strings怎么使用",希望能够解决您遇到有关问题,下面我们一起来看这篇 "Golang中strings怎么使用" 文章。一:查找1、查找返回索引godoc.org上索引的 ...