需要注意的是在通道没有缓冲的情况下,一定要保证有一个接收者,不然就会出错
在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) 的作用是给时间等协程启动