前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go 闭包函数问题

go 闭包函数问题

作者头像
宋天伦
发布2023-10-21 10:06:25
1420
发布2023-10-21 10:06:25
举报
文章被收录于专栏:fryteafrytea

本文 首发于 🌱 煎茶转载 请注明 来源

go 闭包函数问题#

在 Go 里,闭包里的变量会被共享使用,这就意味着当你在运行闭包函数的时候,函数中使用的变量其实是循环的最后一次改变后的值。

为了理解上面这段话,给出一段测试程序:

代码语言:javascript
复制
package main

import "fmt"

func main() {
    data := []string{"one","two","three"}

    // 非正确的捕获方式
    wrongFunctions := make([]func(), 0, 3)
    for _, v := range data {
        wrongFunctions = append(wrongFunctions, func() {
            fmt.Println(v)
        })
    }

    for _, wrongFunc := range wrongFunctions {
        wrongFunc() // 输出 three three three,而不是期望的 one two three
    }

    // 正确的捕获方式
    correctFunctions := make([]func(), 0, 3)
    for _, v := range data {
        value := v // 将值复制到了函数的每个局部版本
        correctFunctions = append(correctFunctions, func() {
            fmt.Println(value)
        })
    }

    for _, correctFunc := range correctFunctions {
        correctFunc() // 输出 one two three
    }
}

运行上述程序输出如下:

代码语言:javascript
复制
go run main.go
three
three
three
one
two
three

问题和解决方案也就很清晰了。

注:本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • go 闭包函数问题#
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档