最近开始学习基于Golang协程实现流量统计系统之协程这套视频,把每天学习的内容总结成文章,第一方便今后复习使用,另外还让想学习的兄弟学习
这是一个例子1:
这就是最简单的goroutine的例子,单协程版
功能:
用goroutine往通道中放入一串字符串
然后从通道中取出该字符串输出打印出来
package main import ( "fmt" ) func main() { var message = make(chan string) //创建一个通道,单通道,只能1进1出 go func() { //创建一个goroutine message <-"hello goroutine1" //往通道中写入字符串,此时通道阻塞 }() fmt.Println(<-message) //从通道中取出数据,此时取出的是刚才写入的字符串,然后输出打印出来。 fmt.Println("helloworld!") }
输出结果:
hello goroutine1
helloworld!
这是对的
接下来我们改进一下,改成两个goroutine同时运行
功能:
第一个goroutine往message写入字符串,
另一个goroutine取出字符串,
并将字符串和另一个字符串进行拼接,再写入message通道中,
然后在main主函数中取出message通道中的拼接过的字符串,输出打印出来。
代码实现:
package main import ( "fmt" "time" ) func main() { //创建通道 var message = make(chan string) go func() { //第一个goroutine往通道中写入 message <-"hello goroutine!" }() go func() { str:=<-message//第二个goroutine从通道中取出字符串 str=str+",i am goroutine!" //将取出的字符串拼接成新的字符串 message<-str //将新的字符串重新写入到message通道中 }() time.Sleep(3*time.Second) //这里需要睡3秒,否则main goroutine直接就输出第一个goroutine的内容就直接return了 fmt.Println(<-message) //通道中取字符串并输出打印 fmt.Println("helloworld!") }
运行结果:
hello goroutine!,i am goroutine!
helloworld!
没有问题
以上是单通道版本,考虑一下能不能多个通道同时运行呢?答案是可以的。现在我们来演示一下
代码如下:
package main import ( "fmt" "time" ) func main() { //创建通道 //goroutine的原则是FIFO,first in first out,先进先出,所以第一个message会先写入到通道message中 //然后进行字符串拼接,拼接后直接main函数中打印输出了,当goroutine1输出后,其它goroutine就没机会拼接字符串了 //

本文通过实例展示了如何利用Golang的协程与通道进行数据处理,包括单协程与多协程的工作流程,以及如何通过通道进行数据传递。
最低0.47元/天 解锁文章
3031

被折叠的 条评论
为什么被折叠?



