惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
酷 壳 – CoolShell
酷 壳 – CoolShell
WordPress大学
WordPress大学
小众软件
小众软件
博客园 - 司徒正美
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
量子位
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
雷峰网
雷峰网
云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
F
Fortinet All Blogs
T
Tailwind CSS Blog
Martin Fowler
Martin Fowler
I
InfoQ
The GitHub Blog
The GitHub Blog
有赞技术团队
有赞技术团队
The Cloudflare Blog
罗磊的独立博客

Oskyla 烹茶室

修复 Joplin on KDE 菜单栏显示问题 Copy Fail:Linux 内核 2017 年至今的高危漏洞(附临时缓解方案) | CVE-2026-31431 Hermes Agent — 在 K3s / K8s 中运行指南 在 K3s 节点上安装并使用 nerdctl Mouser:轻量开源的罗技鼠标驱动替代方案 Claude Opus 4.7:优缺点与评测信息汇总 openFuyao NPU-Operator故障排查 openFuyao 2603 共测测试报告 openFuyao InferNex AI推理集成部署 310P(300I Pro) 环境问题记录及解决 ceph mon Operation not permitted 问题解决 Ascend 310P + openFuyao + NPU-Operator 故障排查 KDE Plasma6 禁用全局菜单,恢复正常应用菜单 终极指南:在 Linux 裸机服务器上快速部署 Moltbot (原 Clawbot) 并集成飞书 Windows 配置 Claude Code 解决 settings.json 不生效 Windows 配置 Claude Code 全流程 2025-12-31 | 年终总结 AI 生图精品提示词|第二期:城市星球 AI 生图精品提示词|第一期 Kubernetes kubectl --raw 使用指南 彻底解决阿里云和 tailscale 冲突 2025-10-21 | 沉淀思维 macOS 单独为鼠标或触控板开启自然滚动 2025-10-16 | 负载高低 2025-10-15 | 睡眠周期 2025-10-14 | 转换情绪与独立观点 go 拉取 gitcode.com 私有 mod Git 将某个文件恢复到其他分支的状态 SSH 通过跳板机连接 lxc 使用 chronyc 构建 ntp 服务 2025-10-13 | 独立思考于未来能源
go 闭包函数问题
Tianlun Song · 2023-08-19 · via Oskyla 烹茶室

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

go 闭包函数问题 在 Go 里,闭包里的变量会被共享使用,这就意味着当你在运行闭包函数的时候,函数

中使用的变量其实是循环的最后一次改变后的值。 为了理解

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

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

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
    }
}

运行上述程序输出如下:

go run main.go
three
three
three
one
two
three

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