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

960930marui · 2025-3-12 09:48:14 · 1035 次点击

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

不知道问题出在哪里了

举报· 1035 次点击
登录 注册 站外分享
9 条回复  
ippolito 初学 2025-3-12 09:59:29
和 go version 相关,你可以降低到 1.21 再试下。
gkirito 初学 2025-3-12 10:00:08
https://tip.golang.org/doc/go1.22 建议看一下这个版本的 release note
thevita 小成 2025-3-12 10:00:17
这个问题吧: https://go.dev/blog/loopvar-preview 具体来说, golang 在 loop 的行为在 1.22 之后变了
sunny352787 小成 2025-3-12 10:00:21
你用的 sdk 版本和示例不一样,golang 的 sdk 中间改过一次
960930marui 楼主 初学 2025-3-12 10:07:41
@ippolito 嗯嗯 我猜测也是这个, 但是不知道再哪里搜哈哈, 下面有f友放链接了, 我好好看下
960930marui 楼主 初学 2025-3-12 10:08:49
@gkirito 好的感谢f友, 了解啦
sky3hao9 初学 2025-3-12 10:28:29
之前遇到过这个坑, 后来用 for v, _ := range some { newV := v; go .... 这种解决的
unclejimao 初学 2025-3-12 10:34:16
@thevita 沃日,以前还把延迟绑定当做特性去理解的,没想到是 Bug ?
mizuki9 小成 2025-3-12 11:03:12
go 一直存在的一个 bug ,存在很久导致人们把它当成 feature 了。然后在 1.22 版本,go 说我们把这个 bug 修复了
返回顶部