🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
># channel 相关操作 - [Go channel 底层结构及实现](https://blog.csdn.net/cjqh_hao/article/details/123948716) - channel 分为无缓存和有缓存 - 无缓存channel 发送数据的时候,需要等到数据被接收后才能继续发送,实时发送 - make(chan int, 0), 没有设置容量,或者容量为0为无缓存channel - 有缓存channel 发送数据的数据,不需要等待接收就可以继续发送,直到数据堆满设定长度 - channel 分为 只能接收,只能发送,能发送也能接收 - 关闭 channel - channel 关闭的时候不能发送消息(send on closed channel ),可以继续接收消息, 如果没有消息了,这时打印channel的数据会是对应类型的零值 - 关闭一个已经关闭的 channel 将会导致panic (panic: close of closed channel ) - 怎么判断 channel 是否关闭 - v, ok := <-ch 取值的时候加判断 - 关闭的channel, v 返回对应类型的零值, ok 返回 false - 判断有缓存channel,缓存数据的长度用 len - channel 是线程安全吗 - 是的, 发送一个数据到Channel和从Channel接收一个数据都是原子性的。而且Go的设计思想就是:不要通过共享内存来通信,而是通过通信来共享内存 - 让多个channe交替输出 - https://blog.csdn.net/weixin_45901764/article/details/123709095 - 如何判断channel是否关闭: v, ok := <-ch - 如何判断channel缓存数据量: len(ch) - 如何设置超时: ``` select { case res := <-ch: fmt.Println(res) case <-time.After(time.Second * 1): fmt.Println("T 1") } ``` - 如何限制发送或接受类型,/限制只能发送或接收 ``` chan T // 可以接收和发送类型为 T 的数据 chan<- float64 // 只可以用来发送 float64 类型的数据 <-chan int // 只可以用来接收 int 类型的数据 ``` - 长度为1(未接收的数量), 容量为2 ~~~ package main import "fmt" func main() { var ch chan int ch = make(chan int, 2) ch <- 1 fmt.Println(len(ch), cap(ch)) } ~~~