为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
拉莫斯之舞 2021-04-08 18:18:55
在以下代码段中,我创建了一个功能列表,按照我的观察方式,该功能列表应包含打印数字0 1 2的功能。package mainimport "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时,这超出了范围。我在这里想念什么?
查看完整描述

1 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

如果我们考虑为这些函数生成什么代码,则确实是相同的:每次都使用相同的变量。即使i在循环后超出范围,它仍会成为闭包的一部分,并且在闭包运行时,它的最新值会被该函数查看。循环退出时,它是3。如果要将闭包绑定到特定值并防止其进一步更改,则可以创建一个狭窄范围的变量,如下所示:


package main


import "fmt"


func main() {

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

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

        j := i  // a different variable for each iteration

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

    }

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

        flist[j]()

    }


查看完整回答
反对 回复 2021-04-19
  • 1 回答
  • 0 关注
  • 320 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信