少说话多写代码之GO开发——008:go通道

栏目: Go · 发布时间: 5年前

内容简介:通道(channel)是可以传递数据的一个数据结构。用操作符比如,

通道(channel)是可以传递数据的一个数据结构。

用操作符 <- 指定通道的方向,发送或接收。如果未指定方向,则为双向通道。

比如,

Chanel <- data    // 把 data 发送到通道 Chanel
value := <-chanel  // 从 Chanel 接收数据赋值给value

通道可以给两个 goroutine 之间传递一个指定类型的值来同步运行和通讯。以如下代码为例,

新建文件grammar4_channel.go,

grammar4_channel.go

package basicGrammar

import "fmt"

//将通道来的数组元素挨个连接
func connectContent(str [] string,channel chan string){
	content := ""
	for _,v:=range str{
		content += v
	}
	channel<- content

}

func TestChannel(){
	//数组
	str:=[]string{"天","地","雨","风","大陆","长空"}
	//定义一个通道
	channel := make(chan string)

	//调用通道
	go connectContent(str[:2],channel)

	go connectContent(str[2:4],channel)

	go connectContent(str[4:],channel)

	//显示结果
	x,y,z:= <-channel,<-channel,<-channel
	fmt.Println(x,y,z)

	//此处关闭通道,后面就没有结果打印出来了
	close(channel)
	go connectContent(str[:2],channel)
	v:= <-channel
	fmt.Println(v)
}

这段代码是通过协程将string数组的元素组合,完成后将组合的值返回并打印。通道的产生是make函数,关闭使用close函数。

上面代码运行结果如下,

大陆长空 天地 雨风

如果将close函数注释掉,则结果是这样

大陆长空 天地 雨风
天地

通道也可以设置缓冲,也是在make时指定缓冲,比如格式如下,

ch := make(chan int, 300)

由于缓冲区的大小是有限的,所以还是必须有接收端来接收数据的,否则缓冲区一满,数据发送端就无法再发送数据了。

另外通道的关闭是这样的,通道接收不到数据后 ,或者本次发送的数据全部收到后,这时通道就可以使用 close() 函数来关闭。如果不关闭接收方在有值可以接收之前会一直阻塞。

代码下载(包含前面全部测试代码): https://download.csdn.net/upload/10990662


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

用户中心设计

用户中心设计

(美国)弗登伯格等编 / 高等教育出版社 / 2003-8 / 20.00元

本书以用户对最终产品或系统的所见及所感为出发点考虑设计方法,所涉及的产品从数据库软件到语音识别软件,在众多项目(医疗保健、金融证券、航空事业、保险业、汽车制造业及零售业等)中得到验证。内容包括:能带来突破性增益的针对UCD的完整的周期化方法;现有产品评测、机构评定以使其适用UCD方法;提高用户感知舒适度;在外延型/内适型应用环境下的软件设计、硬件设计、网站建设和服务中应用UCD;当前UCD优化及未......一起来看看 《用户中心设计》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

html转js在线工具
html转js在线工具

html转js在线工具