ps怎么做网站一寸的照片,网站设计公司行业排名,flask做的网站如何上传文件,建设网站主机免费版Go 语言学习笔记之通道 Channel
大家好#xff0c;我是码农先森。
概念
Go 语言中的通道#xff08;channel#xff09;是用来在 Go 协程之间传递数据的一种通信机制。
通道可以避免多个协程直接共享内存#xff0c;避免数据竞争和锁的使用#xff0c;从而简化了并发程…Go 语言学习笔记之通道 Channel
大家好我是码农先森。
概念
Go 语言中的通道channel是用来在 Go 协程之间传递数据的一种通信机制。
通道可以避免多个协程直接共享内存避免数据竞争和锁的使用从而简化了并发程序的实现。
通道有以下特点
通过 make 函数创建指定通道中传输的数据类型。如果指定通道容量则在发送数据时不会阻塞执行。通道可以是单向或双向的用于限制通道的发送或接收操作。使用 - 操作符来发送和接收数据。发送数据时会阻塞直到有协程接收数据接收数据时也会阻塞直到有协程发送数据。可以使用 close 函数关闭通道通知接收方数据已经发送完成。通道可以用于实现数据同步和协程之间的协作。
select 语句
select 语句是专门为通道而设计的它可以包含若干个候选分支每个分支中的 case 表达式都会包含针对某个通道的发送或接收操作。
当 select 语句被执行时它会根据一套分支选择规则选中某一个分支并执行其中的代码。
如果所有的候选分支都没有被选中那么默认分支就会被执行。注意发送和接收操作的阻塞是分支选择规则的一个很重要的依据。
通道用法
普通用法
创建一个通道 ch用于传输整数类型的数据。然后启动一个协程向通道发送数据发送完毕后关闭通道。
主协程通过 range 循环从通道接收数据并打印出接收到的数据。当通道被关闭后循环会结束。
package mainimport fmtfunc main() {// 创建一个通道用于传输整数类型的数据ch : make(chan int)// 启动一个协程向通道发送数据go func() {for i : 1; i 5; i {ch - i // 发送数据到通道}close(ch) // 关闭通道}()// 主协程从通道接收数据for num : range ch {fmt.Println(Received:, num)}
}结合 Select 语句
创建两个通道 ch1 和 ch2分别用于传输字符串类型的数据。然后启动两个协程一个向 ch1 发送 Hello 消息另一个向 ch2 发送 World 消息发送间隔分别为 1 秒和 2 秒。
主协程通过 select 不断监听 ch1 和 ch2一旦其中一个通道有数据就绪就执行相应的代码块打印接收到的消息。通过 select我们可以同时处理多个通道的数据交互 package mainimport (fmttime
)func main() {ch1 : make(chan string)ch2 : make(chan string)// 协程1每隔1秒向 ch1 发送 Hellogo func() {for {time.Sleep(1 * time.Second)ch1 - Hello}}()// 协程2每隔2秒向 ch2 发送 Worldgo func() {for {time.Sleep(2 * time.Second)ch2 - World}}()// 主协程通过 select 从 ch1 和 ch2 中接收数据for {select {case msg1 : -ch1:fmt.Println(From ch1:, msg1)case msg2 : -ch2:fmt.Println(From ch2:, msg2)}}
}总结
一个通道相当于一个先进先出FIFO的队列。通道中的各个元素值都是严格地按照发送的顺序排列的先被发送通道的元素值一定会先被接收。元素值的发送和接收都需要用到操作符 -。
通道避免了多个协程直接共享内存而导致的数据竞争问题保证了数据的并发安全。通道让不同协程之间可以通过数据传递进行通信而不用直接关心对方的具体实现细节。 欢迎关注、分享、点赞、收藏、在看我是微信公众号「码农先森」作者。