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且不再变化了 



感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接
posted @   南昌拌粉的成长  阅读(73)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示