为什么我的 defer 运行结果和示例不一样

179 天前
 960930marui

package main

import "fmt"

type Test struct { name string }

func (t *Test) Close() { fmt.Println(t.name, " closed") } func main() { ts := []Test{{"a"}, {"b"}, {"c"}} for _, t := range ts { defer t.Close() } }

示例是: c closed c closed c closed

我的运行结果是: c closed b closed a closed

不知道问题出在哪里了

1758 次点击
所在节点    Go 编程语言
11 条回复
ippolito
179 天前
和 go version 相关,你可以降低到 1.21 再试下。
gkirito
179 天前
https://tip.golang.org/doc/go1.22
建议看一下这个版本的 release note
thevita
179 天前
这个问题吧: https://go.dev/blog/loopvar-preview

具体来说, golang 在 loop 的行为在 1.22 之后变了
sunny352787
179 天前
你用的 sdk 版本和示例不一样,golang 的 sdk 中间改过一次
960930marui
179 天前
@ippolito 嗯嗯 我猜测也是这个, 但是不知道再哪里搜哈哈, 下面有 v 友放链接了, 我好好看下
960930marui
179 天前
@gkirito 好的感谢 v 友, 了解啦
sky3hao9
179 天前
之前遇到过这个坑, 后来用 for v, _ := range some { newV := v; go .... 这种解决的
unclejimao
179 天前
@thevita 沃日,以前还把延迟绑定当做特性去理解的,没想到是 Bug ?
mizuki9
179 天前
go 一直存在的一个 bug ,存在很久导致人们把它当成 feature 了。然后在 1.22 版本,go 说我们把这个 bug 修复了
rekulas
179 天前
也不能完全说是 bug 吧,要真被定义为 bug 他们早就修复了,主要是社区之前觉得这个不是问题,一直拖到最近 2 年声音大了才决定修改,感觉 go 社区核心人员也挺头铁的,反正很多优化用户提了很久也不甩你
qxmqh
179 天前
版本问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1117750

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX