package main
import (
"fmt"
"sync"
)
func main() {
ch := make(chan bool, 1)
defer close(ch)
wg := sync.WaitGroup{}
wg.Add(2)
go func() {
ch <- true
defer wg.Done()
var nums []int = []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
for _, num := range nums {
<-ch
fmt.Print(num, " ")
ch <- true
}
}()
go func() {
defer wg.Done()
var letters []byte = []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}
for _, letter := range letters {
<-ch
fmt.Print(string(letter), " ")
ch <- true
}
}()
wg.Wait()
}
上述代码会概率性的打印下述两种结果。为什么会出现这种现象?
a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j
1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i j
相比较上述代码只是将 第 1 个 goroutine 第一行的 ch <- true
移动到了第 2 个 goroutine 中
package main
import (
"fmt"
"sync"
)
func main() {
ch := make(chan bool, 1)
defer close(ch)
wg := sync.WaitGroup{}
wg.Add(2)
go func() {
defer wg.Done()
var nums []int = []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
for _, num := range nums {
<-ch
fmt.Print(num, " ")
ch <- true
}
}()
go func() {
ch <- true
defer wg.Done()
var letters []byte = []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}
for _, letter := range letters {
<-ch
fmt.Print(string(letter), " ")
ch <- true
}
}()
wg.Wait()
}
上述代码会概率性的打印出下述几种结果。为什么会出现这种现象?
a b c d e f g h i j 1 2 3 4 5 6 7 8 9
a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j
a b 1 c 2 d 3 e 4 f 5 g 6 h 7 i 8 j 9
如果执行次数比较少,可能不会出现这个现象。但是如果执行上百次,就会出现。
for i in {1..100}; do go run main.go; done
如果我想稳定的先打印数字,再打印字母,应该如何修改?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.