channel的阻塞有顺序吗? 一个简单的1到100交替打印引发的问题

func main()  {
	foochannel := make(chan int)
	total := make(chan int)
	go print1(foochannel, total);
	go print2(foochannel);
	foochannel<-1
	total<-1
}
func print2(c chan int) {
	for i:= 1; i <= 50; {
		<-c
		fmt.Println(i*2-1)
		i++
		c<-1
	}
}
func print1(c chan int, b chan int) {
	for i:= 1; i <= 50; {
		<-c
		fmt.Println(i*2)
		if i != 50 {
			c<-1
		}
		i++
	}
	<-b
}

为什么可以1到100交替打印? 我理解channel的阻塞是没有顺序的,为什么每次都是print2先执行?

共 1 个回复


496543679

你把这两个语句换个位置试试。
go print1(foochannel, total);
go print2(foochannel);
我的答案是:(去除换行符)
2 1 4 3 6 5 8 7 10 9 12 11 14 13 16 15 18 17 20 19 22 21 24 23 26 25 28 27 30 29 32 31 34 33 36 35 38 37 40 39 42 41 44 43 46 45 48 47 50 49 52 51 54 53 56 55 58 57 60 59 62 61 64 63 66 65 68 67 70 69 72 71 74 73 76 75 78 77 80 79 82 81 84 83 86 85 88 87 90 89 92 91 94 93 96 95 98 97 100 命令退出代码 0.
看到没?99到那去了?因为print2最后一次没有发信号。

# 0