概念及作用

channel是一个数据类型,用于实现同步,用于两个协程之间交换数据。goroutine奉行通过通信来共享内存,而不是共享内存来通信。
引用类型channel是CSP模式的具体实现,用于多个goroutine通讯。其内部实现了同步,确保并发安全。

创建及使用
每个channel在创建的时候必须指定一个类型,指定的类型是任意的。

ch := make(chan int)   //使用内置的make函数,可以创建一个channel类型
// 发送数据到channel
ch <-
// 从channel接受数据
x := <- ch

案例举例(一)

①创建channel前

package main

import (
"fmt"
"time"
) //定义一个打印机,参数为字符串,按每个字符打印
//打印机属于公共资源
func Printer(str string) {
for _, data := range str {
fmt.Printf("%c", data)
time.Sleep(time.Second)
}
fmt.Printf("\n")
} func person1() {
Printer("hello")
} func person2() {
Printer("world")
} func main() {
//新建2个协程,代表2个人,2个人同时使用打印机
go person1()
go person2() //特地不让主协程结束,死循环
for { }
}
//结果
hwoerllldo //交叉执行

②创建channel后(注意channel变量和调用的先后顺序)

package main

import (
"fmt"
"time"
) //全局变量,创建一个channel
var ch = make(chan int) //定义一个打印机,参数为字符串,按每个字符打印
//打印机属于公共资源
func Printer(str string) {
for _, data := range str {
fmt.Printf("%c", data)
time.Sleep(time.Second)
}
fmt.Printf("\n")
} //person1执行完后,才能到person2执行
func person1() {
Printer("hello")
ch <- //给管道写数据,发送
} func person2() {
<-ch //从管道取数据,接收,如果通道没有数据他就会阻塞
Printer("world")
} func main() {
//新建2个协程,代表2个人,2个人同时使用打印机
go person1()
go person2() //特地不让主协程结束,死循环
for { }
}
hello
world

案例举例(二)

package main

import (
"fmt"
) func main() {
ch := make(chan string)
go func() {
fmt.Println("aaaaaaaaaa")
str := <-ch // 在执行到这一步的时候main goroutine才会停止阻塞
fmt.Println("取出channel的数据" + str)
}()
fmt.Println("bbbbbbbbbb")
ch <- "hello" // 如果没有其他goroutine来取走这个数据,main goroutine挂起,直到其它gorouteine把数据拿走(这里会暂时阻塞)
fmt.Println("cccccccccc")
}
bbbbbbbbbb
aaaaaaaaaa
取出channel的数据hello
cccccccccc

最新文章

  1. Oracle分析函数入门
  2. PyCharm 5 破解注册方法
  3. c/c++ 关于swap的不同写法
  4. JSP编程-步步为营
  5. iOS开发零碎笔记
  6. ASP.NET NuGet to install the mvc 5.2.2
  7. 单例模式 - OK
  8. ZOJ 3430 Detect the Virus 【AC自动机+解码】
  9. C#利用QrCode.Net生成二维码(Qr码)
  10. C语言之阶乘
  11. Windows Server 2016-PS筛选导出用户邮箱属性包含某字段列表
  12. Python中pandas dataframe删除一行或一列:drop函数
  13. memcached解压报错gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now的解决方法
  14. git使用详细过程
  15. (3.15)mysql基础深入——mysql默认数据库/系统数据库
  16. file类中,命令记录
  17. wget常见用法
  18. 铁乐学Python_day11_闭包函数
  19. 使用idea的的第一个坑-----javax.xml.ws.WebServiceRef
  20. android ListView几个有用的属性

热门文章

  1. css页面布局--三栏(两边固定中间自适应&amp;两边自适应中间固定)
  2. 题外话:Lua脚本语言存在的意义
  3. POJ 3461 Oulipo(模式串在主串中出现次数 可重叠)
  4. Oracle 23的用户管理
  5. c# 在mongo中查询经纬度范围
  6. 将Web项目War包部署到Tomcat服务器基本步骤
  7. 记前些日子archlinux更新后无法调节声音的解决方法
  8. caffe神经网络中不同的lr_policy间的区别
  9. day1 hbuilder的使用
  10. html5-css列表和表格