函数列表中的Golang函数具有最后一个值

在以下代码段中,我创建了一个功能列表,按照我的观察方式,该功能列表应包含打印数字0 1 2的功能。


package main


import "fmt"


func main() {

    flist := make([]func(), 0)

    for i := 0; i < 3; i++ {

        flist = append(flist, func() { fmt.Printf("%d ", i) })

    }

    for j := 0; j < 3; j++ {

        flist[j]()

    }

}

但是,所有函数flist均相同main.main.func1,输出为


3 3 3


即使i在循环中永远不会达到值3。这会让我觉得func只是简单地使用的地址i,每次都创建相同的func,但是i当以后调用func时,这超出了范围。


我在这里想念什么?


拉莫斯之舞
浏览 321回答 1
1回答

吃鸡游戏

如果我们考虑为这些函数生成什么代码,则确实是相同的:每次都使用相同的变量。即使i在循环后超出范围,它仍会成为闭包的一部分,并且在闭包运行时,它的最新值会被该函数查看。循环退出时,它是3。如果要将闭包绑定到特定值并防止其进一步更改,则可以创建一个狭窄范围的变量,如下所示:package mainimport "fmt"func main() {&nbsp; &nbsp; flist := make([]func(), 0)&nbsp; &nbsp; for i := 0; i < 3; i++ {&nbsp; &nbsp; &nbsp; &nbsp; j := i&nbsp; // a different variable for each iteration&nbsp; &nbsp; &nbsp; &nbsp; flist = append(flist, func() { fmt.Printf("%d ", j) })&nbsp; &nbsp; }&nbsp; &nbsp; for j := 0; j < 3; j++ {&nbsp; &nbsp; &nbsp; &nbsp; flist[j]()&nbsp; &nbsp; }}&nbsp;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go