func source(c chan<- int32) {
ra, rb := rand.Int31(), rand.Intn(3) + 1
time.Sleep(time.Duration(rb) * time.Second) // 睡眠1~3秒
c <- ra
}
func main() {
rand.Seed(time.Now().UnixNano())
c := make(chan int32, 5) // 必须用一个缓冲通道
for i := 0; i < cap(c); i++ { // 通道容量和goroutine一样多
go source(c)
}
rnd := <- c // 只有第一个回应被使用了
fmt.Println(rnd)
}
--------------------------------------------------------------------------------
func source(c chan<- int32) {
ra, rb := rand.Int31(), rand.Intn(3)+1
time.Sleep(time.Duration(rb) * time.Second)
select {
case c <- ra:
default: // 非阻塞
}
}
func main() {
rand.Seed(time.Now().UnixNano())
c := make(chan int32, 1) // 通道容量比goroutine数量少
for i := 0; i < 5; i++ {
go source(c)
}
rnd := <-c
fmt.Println(rnd)
}