最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Go元素的关键字所在--chan通道

来源:懂视网 责编:小采 时间:2020-11-27 15:23:36
文档

Go元素的关键字所在--chan通道

Go元素的关键字所在--chan通道:HTML validate是指HTML验证。它是通过与标准HTML规则进行比较的方式,分析HTML文档、标记出错误和非标准代码的处理过程。Web页面使用HTML进行渲染,而HTML本身采用了HTML规范作为其规则和标准。通过验证HTML代码穿越多重浏览器标准!chanchan又称之为
推荐度:
导读Go元素的关键字所在--chan通道:HTML validate是指HTML验证。它是通过与标准HTML规则进行比较的方式,分析HTML文档、标记出错误和非标准代码的处理过程。Web页面使用HTML进行渲染,而HTML本身采用了HTML规范作为其规则和标准。通过验证HTML代码穿越多重浏览器标准!chanchan又称之为

读取通道操作:

val,ok := <-ch

使用断言读取通道中的值,检查通道是否还有内容,以及判断通道是否已经关闭,当通道中没有信息,且通道已经关闭时,ok值为false,当通道没有关闭,但是通道中没有信息,程序将会阻塞,如果通道中有内容,则ok值是true。

另一种不使用断言的方式读取通道

val := <-ch

写入与读取通道

读取不带缓冲的通道示例方法:

package mainimport ( "fmt")func main() { // 定义一个不带缓冲的通道,通道中数据类型是int
 var c = make(chan int) // 开启一个携程,读取通道中的内容
 go func() {
 fmt.Println("写入信息是:", <-c)
 }() // 向通道中写入数据
 c <- 1}

输出结果:

写入信息是: 1

当对带缓冲的通道进行读写时,只要通道中数据长度不大于缓冲长度,就不会出现阻塞,但是读取带缓冲的通道,通道中没有内容时,程序依然会进入阻塞状态。所以,带缓冲的通道,只对写入产生影响。下边来一个示例:

package mainimport ( "fmt")func main() { var c = make(chan int, 3)
 c <- 1
 c <- 2
 c <- 3
 //c <- 4
 fmt.Println("end")
}

输出信息是:

end

当向带3个缓冲的通道中写入内容时,由于只写入了3次,通道的长度刚好等于缓冲的长度,程序没有阻塞,当将 c <- 4 前边的注释去掉后,由于没有程序去读取这个通道,主程序进入死锁状态而导致异常。

协程通信

通道类型变量的实质上是一个地址,如下边示例代码:

package mainimport ( "fmt")func main() { var c = make(chan int, 3)
 fmt.Println(c)
}

输出结果:

0xc042072080

所以,当通道类型变量当做参数传入函数后,在函数中可以直接对通道中的值进行修改。虽然chan类型变量是一个地址,但是golang不允许使用取值操作符( * )来操作chan类型变量。但是如果你先对chan类型变量使用取地址操作符(&),然后再使用取值操作符(*),这种操作方法还是可以正常运行的,但是这意义不大,除非你的目的是在函数调用中,重新定义一个chan类型变量替换原来的变量。

chan的这些特性,可以很好的实现协程之间的同步功能。不带缓冲的通道,是一种零容忍的等待,可以实现强制同步;带缓冲的通道,是有一定量容忍度的等待,可以实现允许有一定时间差的同步。

简单的协程间通信例子:

package mainimport ( "fmt"
 "time")func main() { var c = make(chan int) go func() {
 fmt.Println("待命模式:") // 读取通道时产生阻塞,等待其他协程向通道写入信息
 fmt.Println("命令代码是:", <-c)
 }() go func() { // 延时3秒,向通道中写入信息
 time.Sleep(time.Second * 3)
 fmt.Println("发送命令:")
 c <- 8
 close(c)
 }()
 time.Sleep(time.Second * 5)
 fmt.Println("执行完成")
}

输出信息是:

待命模式:
发送命令:
命令代码是: 8
执行完成

相关推荐:

HTML validate HTML验证_HTML/Xhtml_网页制作

HTML技巧汇编_CSS/HTML

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

Go元素的关键字所在--chan通道

Go元素的关键字所在--chan通道:HTML validate是指HTML验证。它是通过与标准HTML规则进行比较的方式,分析HTML文档、标记出错误和非标准代码的处理过程。Web页面使用HTML进行渲染,而HTML本身采用了HTML规范作为其规则和标准。通过验证HTML代码穿越多重浏览器标准!chanchan又称之为
推荐度:
标签: 通道 关键字 go
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top