Go 通道(channel)
2022/7/26 23:23:39
本文主要是介绍Go 通道(channel),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
通道(channel),就像一个可以用于发送类型化数据的管道,由其负责协程之间的通信,从而避开所有由共享内存导致的陷阱;这种通过通道进行通信的方式保证了同步性。数据在通道中进行传递:在任何给定时间,一个数据被设计为只有一个协程可以对其访问,所以不会发生数据竞争。
-
创建通道
ch1 := make(chan string)
构建一个 int 通道的通道:chanOfChans := make(chan chan int)
带缓冲带的通道ch1 := make(chan string, 0)
0 指可接收 0 个string
, 即(阻塞),如果时大于 0 的数值,则为(非阻塞),取决于指的大小。 -
数据发送
ch1 <- '123'
将字符串 '123' 发送到ch1
通道。 -
数据接收
str2 := <- ch1
使用str2
变量接收通道的数据。 -
关闭通道
close(ch1)
package main import ( "fmt" "time" ) func main() { ch := make(chan string) defer close(ch) go sendData(ch) go getData(ch) // 等待了 1 秒让两个协程完成,如果不这样,sendData() 就没有机会输出。 time.Sleep(1e9) } func sendData(ch chan string) { ch <- "London" ch <- "Beijing" } func getData(ch chan string) { var input string // time.Sleep(2e9) for { input = <- ch fmt.Printf("input is (%v)\n", input) } }
注意事项:
- 如果 2 个协程需要通信,你必须给他们同一个通道作为参数才行。
- getData() 使用了无限循环:它随着 sendData() 的发送完成和 ch 变空也结束了。
- 如果移除一个或所有 go 关键字,程序无法运行,Go 运行时会抛出 panic:
---- Error run channel.exe with code Crashed ---- Program exited with code -2147483645: panic: all goroutines are asleep-deadlock!
通道阻塞
- 对于同一个通道,发送操作(协程或者函数中的),在接收者准备好之前是阻塞的:如果
ch
中的数据无人接收,就无法再给通道传入其他数据:新的输入无法在通道非空的情况下传入。所以发送操作会等待ch
再次变为可用状态:就是通道值被接收时(可以传入变量)。 - 对于同一个通道,接收操作是阻塞的(协程或函数中的),直到发送者可用:如果通道中没有数据,接收者就阻塞了。
这篇关于Go 通道(channel)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-15SendGrid 的 Go 客户端库怎么实现同时向多个邮箱发送邮件?-icode9专业技术文章分享
- 2024-11-15SendGrid 的 Go 客户端库怎么设置header 和 标签tag 呢?-icode9专业技术文章分享
- 2024-11-12Cargo deny安装指路
- 2024-11-02MongoDB项目实战:从入门到初级应用
- 2024-11-01随时随地一键转录,Google Cloud 新模型 Chirp 2 让语音识别更上一层楼
- 2024-10-25Google Cloud动手实验详解:如何在Cloud Run上开发无服务器应用
- 2024-10-24AI ?先驱齐聚 BAAI 2024,发布大规模语言、多模态、具身、生物计算以及 FlagOpen 2.0 等 AI 模型创新成果。
- 2024-10-20goland工具下,如修改一个项目的标准库SDK的版本-icode9专业技术文章分享
- 2024-10-17Go学习:初学者的简单教程
- 2024-10-17Go学习:新手入门完全指南