go 语言 for循环的一个坑
1、案例1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package main import "fmt" type Card struct { id int } func main() { list := make([]*Card, 0) card := &Card{} for index := 1; index < 10; index++ { card.id = index list = append(list, card) } //fmt.Println(list) for _, c := range list { fmt.Println(*c) } } |
输出结果:
2、案例2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | package main import "fmt" type Card struct { id int } func main() { list := make([]*Card, 0) card := &Card{} for index := 1; index < 10; index++ { card = &Card{ id: index, } list = append(list, card) } for _, c := range list { fmt.Println( "Card" , c) } } |
输出结果:
3、案例3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package main import "fmt" type Card struct { id int } func main() { list := make([]*Card, 0) for index := 1; index < 10; index++ { card := &Card{} card.id = index list = append(list, card) } for _, c := range list { fmt.Println( "Card" , c) } } |
输出结果:
4、闭包和协程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | package main import ( "fmt" "time" ) func main() { for i := 0; i < 10; i++ { go func () { fmt.Println(i) }() // 输出全部为10 } time.Sleep(time.Second) } |
在每个协程中,从进入匿名函数到调用Println将i
的值复制入栈之间仍需要一小段时间运行,而这段时间内足以主线程完成全部10次循环。所以终于到将i
的值复制入栈调用Println时,i
已经成为10且不再变化了
感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具