package main import ( "fmt" "time" ) // 基于channel编写一个简单的单线程生产者消费者模型 // 队列:队列长度10,队列元素类型为int // 生产者:每1秒往队列中放入一个类型为int的元素,队列满时生产者可以阻塞 // 消费者:每1秒从队列中获取一个元素并打印,队列为空时消费者阻塞 // ch chan <- int ,定义chan 只能写进去,不能读出去,只写类型,并且只能向里面写int类型元素。可以想象下 chan <- ,从右至左,chan是个盒子,<-箭头是方向 func prodece(ch chan <- int){ for i:=0;i<10;i++{ ch <- i time.Sleep(1*time.Second) fmt.Printf("produce data:%d\n",i) } close(ch) } // ch <- chan int 定义chan是只能读出去,不能写进去,当然也可以不不要<-, 代表可读可写 func consumer(ch chan int){ for i := range ch{ fmt.Printf("get data:%d\n", i) } } // 这样也可以 // func consumer2(ch <- chan int){ // for i := range ch{ // fmt.Printf("get data:%d\n", i) // } // } func main(){ // var ch chan int,这样定义chan也可以,但是初始值时nil,不能使用,所以使用make关键字定义chan ch := make(chan int, 10) // go produce,让produce在协程中运行,这样不会阻塞consumer从chan中拿数据 go prodece(ch) consumer(ch) }
打印结果是:
get data:0 produce data:0 get data:1 produce data:1 get data:2 produce data:2 get data:3 produce data:3 get data:4 produce data:4 get data:5 produce data:5 get data:6 produce data:6 get data:7 produce data:7 get data:8 produce data:8 get data:9 produce data:9 [Done] exited with code=0 in 10.689 seconds