go语言-channel和range,select

笔记 / 2021-03-15

channel和range

package main

import "fmt"

func main() {
	c:= make(chan int)

	go func() {
		for i:=0;i<3;i++{
			c<-i
		}
		// 当不需要再次发送数据后需要关闭channel,如果被关闭可能会引发死锁
		close(c)
	}()

	// range 会阻塞等待
	for num := range c{
		fmt.Println(num)
	}
}
0
1
2

channel和select

  • select用来监视多个channel状态
package main

import "fmt"

func yield(c,quit chan int)  {
	temp:=2
	for  {
		select {
		case c<-temp:
			temp*=2
		case <-quit:
			return
		}
	}
}


func main() {
	c :=make(chan int)
	quit :=make(chan int)

	go func() {
		for i:=0;i<10;i++ {
			fmt.Println(<-c)
		}
		quit<-0
	}()

	yield(c,quit)
}
2
4
8
16
32
64
128
256
512
1024