AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
### 无缓冲channel 无缓冲通道(unbuffered channel)是指在接收钱没有能力保存任何值的通道. 这种类型的通道要求发送goroutine和接收goroutine同事准备好,才能完成发送和接收操作. 如果两个goroutine 没有同时准备好,通道会导致先执行发送或接收操作的goroutine阻塞等待 . 这种对通道进行发送和接收的交互行为本身就是同步的,其中任意一个操作都无法离开另一个操作单独存在 . ### 创建方式 ~~~ make(chan Type) //等价于make(chan Type ,0) ~~~ 如果没有指定缓冲容量,那么该通道就是同步的,因此会阻塞到发送者准备好发送和接收者准备好接收 . ### 无缓冲channel特点 当你写的时候,对面没读,写方会阻塞. 当你读的时候,对面没写,读方会堵塞 . ~~~ func main() { ch := make(chan int, 0) //创建一个无缓冲channel fmt.Printf("缓冲区剩余数据个数 = %d ,缓冲区容量 = %d\n", len(ch), cap(ch)) //新建协程 go func() { for i := 0; i < 3; i++ { fmt.Println("子协程i = ", i) ch <- i //往channel写数据 } }() time.Sleep(2 * time.Second) //延迟2秒 for i := 0; i < 3; i++ { num := <-ch fmt.Println("num = ", num) } } ~~~ ~~~ 缓冲区剩余数据个数 = 0 ,缓冲区容量 = 0 子协程i = 0 num = 0 子协程i = 1 子协程i = 2 num = 1 num = 2 ~~~