需要注意的是在通道没有缓冲的情况下,一定要保证有一个接收者,不然就会出错
在main函数执行结束的时候,协程就会被回收,就像是一个打开盒子装饰品的游戏,当选手还没有开盒子的时候,游戏结束了
package main
import (
"log"
"time"
)
//定义一个服务结构
type Server struct {
queue chan []byte
}
func say(str string) {
log.Println(str)
}
func write(server *Server, bt []byte) {
//写入数据到通道
server.queue <- bt
}
//函数
func (s *Server) run() {
for {
select {
case bt := <-s.queue:
log.Println("队列中有数据了:")
log.Println(bt)
}
}
}
func main() {
server := &Server{queue: make(chan []byte)}
go say("hello")
//查看通道的容量
// log.Println("缓冲区中的大小为 %v", cap(server.queue))
//查看缓冲区中的使用量
// log.Println("缓冲区已使用量为 %v", len(server.queue))
//消费队列
go server.run()
write(server, []byte{'A'}) //写入服务在 协程执行之前,而通道没有缓存的时候就会出错
server.queue <- []byte{'A', 'B', 'C', 'D', 'E', 'F', 'G'}
server.queue <- []byte{'H', 'I', 'J', 'K', 'L', 'M', 'N'}
log.Println("程序执行结束")
time.Sleep(time.Millisecond * 1000)
}
time.Sleep(time.Millisecond * 1000) 的作用是给时间等协程启动