为了学习更多关于 Go 的知识,我一直在玩 goroutines,并且注意到了一些东西 - 但我不确定我看到了什么,希望有人能够解释以下行为。
以下代码完全符合您的期望:
package main
import (
"fmt"
)
type Test struct {
me int
}
type Tests []Test
func (test *Test) show() {
fmt.Println(test.me)
}
func main() {
var tests Tests
for i := 0; i < 10; i++ {
test := Test{
me: i,
}
tests = append(tests, test)
}
for _, test := range tests {
test.show()
}
}
并按顺序打印 0 - 9。
现在,当代码如下所示更改时,它总是首先返回最后一个 - 无论我使用哪个数字:
package main
import (
"fmt"
"sync"
)
type Test struct {
me int
}
type Tests []Test
func (test *Test) show(wg *sync.WaitGroup) {
fmt.Println(test.me)
wg.Done()
}
func main() {
var tests Tests
for i := 0; i < 10; i++ {
test := Test{
me: i,
}
tests = append(tests, test)
}
var wg sync.WaitGroup
wg.Add(10)
for _, test := range tests {
go func(t Test) {
t.show(&wg)
}(test)
}
wg.Wait()
}
这将返回:9 0 1 2 3 4 5 6 7 8
循环的迭代顺序没有改变,所以我想这与 goroutines 有关系……基本上,我试图理解为什么它的行为是这样的……我知道 goroutines 可以在与它们产生的顺序不同,但是,我的问题是为什么这总是这样运行。好像有什么很明显的东西我错过了......
忽然笑
潇潇雨雨
相关分类