channel和range

  1. package main
  2. import "fmt"
  3. func main() {
  4. c:= make(chan int)
  5. go func() {
  6. for i:=0;i<3;i++{
  7. c<-i
  8. }
  9. // 当不需要再次发送数据后需要关闭channel,如果被关闭可能会引发死锁
  10. close(c)
  11. }()
  12. // range 会阻塞等待
  13. for num := range c{
  14. fmt.Println(num)
  15. }
  16. }
  1. 0
  2. 1
  3. 2

channel和select

  • select用来监视多个channel状态
  1. package main
  2. import "fmt"
  3. func yield(c,quit chan int) {
  4. temp:=2
  5. for {
  6. select {
  7. case c<-temp:
  8. temp*=2
  9. case <-quit:
  10. return
  11. }
  12. }
  13. }
  14. func main() {
  15. c :=make(chan int)
  16. quit :=make(chan int)
  17. go func() {
  18. for i:=0;i<10;i++ {
  19. fmt.Println(<-c)
  20. }
  21. quit<-0
  22. }()
  23. yield(c,quit)
  24. }
  1. 2
  2. 4
  3. 8
  4. 16
  5. 32
  6. 64
  7. 128
  8. 256
  9. 512
  10. 1024