话说今天在玩select的时候发现一个问题,是这样的:
片段1:
func main(){
var count int
for {
select {
case <-time.Tick(time.Millisecond * 500):
fmt.Println("咖啡色的羊驼")
count
fmt.Println("count--->" , count)
case <-time.Tick(time.Millisecond * 499) :
fmt.Println(time.Now().Unix())
count
fmt.Println("count--->" , count)
}
}
}
片段2:
func main(){
t1 := time.Tick(time.Second)
t2 := time.Tick(time.Second)
var count int
for {
select {
case <-t1:
fmt.Println("咖啡色的羊驼")
count
fmt.Println("count--->" , count)
case <-t2 :
fmt.Println(time.Now().Unix())
count
fmt.Println("count--->" , count)
}
}
}
两个问题:
1.以上片段的输出结果是?
2.如何解释?
第一个问题好解决,跑一下就是,很明显输出结果肯定不同。
片段1:
1535673600
count---> 1
1535673600
count---> 2
1535673601
count---> 3
片段2:
咖啡色的羊驼
count---> 1
1535673600
count---> 2
咖啡色的羊驼
count---> 3
1535673601
count---> 4
第二个好理解,因为select监听了两个time的通道,所以交替出现。
那么第一个为何只有出现1个?
为了这个问题不得不把select的实现机制走一波,所以有了此文。