Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了学习笔记:channel的初步理解大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

chAnnel会阻塞,阻塞的时候系统会继续顺序调用其他goroutIne,main()也是一个goroutIne,只是最先被执行。

一个代码

<!-- lang:sHell -->
package main

import (
	"fmt"
)

func display(msg String,c chan bool) {
	fmt.Println(msg)
	c <- true
	fmt.Printf("end %s \n",msg)
}

func main() {
	c := make(chan bool)
	go display("Hello",C)
	go display("Hello1",C)
	go display("Hello2",C)
	fmt.Println("start")
	<-c
	fmt.Println("end")
}

这段代码输出结果:

<!-- lang: sHell -->
start
Hello
end Hello
Hello1
Hello2
end

首先执行main函数,它是第一个goroutIne,在main中又通过go语句创建了3个goroutIne,但是不是立即执行的,它们必须等到main挂起后才会被调用。 当main执行到 <-c 的时候,根据chAnnel特性,此时产生了阻塞,这时候系统会将main的goroutIne挂起,继续调用其他goroutIne,也就是先前创建的3个goroutIne,从第一个开始。 执行到:go display("Hello",C) 这时候首先打印出Hello,随机函数中 c <- true 因为main已经在等待接受,所以这里发送成功,继续执行下面的代码即打印出end Hello,同时由于接受者main也接收到了信息,main的goroutIne阻塞取消,被激活,可被继续调用。 但这时候不会立即@L_264_0@main的,因为然main被重新激活了,但是它已经被排到剩下两个goroutIne后面了,所以接下来实际上继续执行的goroutIne是 go display("Hello1",C) 。 在 go display("Hello1",C) 中,Hello1首先被打印出来,随机 c <- true 像chAnnel中发送消息,但是由于没有接收者(main已经接收过了),所以这个goroutIne也被阻塞,系统继续调用一个goroutIne,同理只输出Hello2,最后再@L_264_0@main的goroutIne,打印出end。

以上是无缓冲的chAnnel,有缓冲的阻塞原理与这个不一样。

大佬总结

以上是大佬教程为你收集整理的学习笔记:channel的初步理解全部内容,希望文章能够帮你解决学习笔记:channel的初步理解所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。