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上索引的 ...