GO语言实战十语言实战十 管道管道
上一篇记录了goroutine操作共享数据时保证对共享资源的安全访 问以及消除竞争状态
原子操作
互斥锁
这里介绍通道
不要通过共享内存来通信,而应该通过通信来共享内存不要通过共享内存来通信,而应该通过通信来共享内存
什么是通道什么是通道
Channel 也是Go语言里的一种引用类型,通道可以被认为是Goroutines通信的管道。类似于管道中的水从一端到另一端的流动,数据可以从一端发送到另一端,通过通道接
收。
当一个资源需要在 goroutine 之间共享时,通道在 goroutine 之间架起了一个管道,并提供了 确保同步交换数据的机制。声明通道时,需要指定将要被共享的数据的类型。
可以通过通道共享 内置类型、命名类型、结构类型和引用类型的值或者指针。
无缓冲的通道保证同时交换数据,而有缓冲的通道不做这种保证
创建通道创建通道
使用 make函数 和关键词 chan创建通道,使用 <- 运算符 进行赋值和读取操作
//创建 无缓冲通道 整型
unbuffer := make(chan int)
//创建 有缓冲通道 字符串型
buffer := make(chan string, 10)
fmt.Printf("%T=====%T",unbuffer,buffer)
//chan int=====chan string通道收到了 test1
buffer <- "test1"
//从通道接收字符串
value := <-buffer
fmt.Println("通道收到了",value)//通道收到了 test1
无缓冲通道无缓冲通道
无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道。这种类型的通 道要求发送 goroutine 和接收 goroutine 同时准备好,才能完成发送和接收操
作。如果两个 goroutine 没有同时准备好,通道会导致先执行发送或接收操作的 goroutine 阻塞等待。这种对通道进行发送 和接收的交互行为本身就是同步同步的。其中任意一
个操作都无法离开另一个操作单独存在。