通道

// _通道_ 是连接多个 Go 协程的管道。你可以从一个 Go 协程
// 将值发送到通道,然后在别的 Go 协程中接收。package mainimport "fmt"func main() {// 使用 `make(chan val-type)` 创建一个新的通道。// 通道类型就是他们需要传递值的类型。messages := make(chan string)// 使用 `channel <-` 语法 _发送_ 一个新的值到通道中。这里// 我们在一个新的 Go 协程中发送 `"ping"` 到上面创建的// `messages` 通道中。go func() { messages <- "ping" }()// 使用 `<-channel` 语法从通道中 _接收_ 一个值。这里// 将接收我们在上面发送的 `"ping"` 消息并打印出来。msg := <-messagesfmt.Println(msg)
}

通道缓冲

// 默认通道是 _无缓冲_ 的,这意味着只有在对应的接收(`<- chan`)
// 通道准备好接收时,才允许进行发送(`chan <-`)。_可缓存通道_
// 允许在没有对应接收方的情况下,缓存限定数量的值。package mainimport "fmt"func main() {// 这里我们 `make` 了一个通道,最多允许缓存 2 个值。messages := make(chan string, 2)// 因为这个通道是有缓冲区的,即使没有一个对应的并发接收// 方,我们仍然可以发送这些值。messages <- "buffered"messages <- "channel"// 然后我们可以像前面一样接收这两个值。fmt.Println(<-messages)fmt.Println(<-messages)
}

通道同步

// 我们可以使用通道来同步 Go 协程间的执行状态。这里是一个
// 使用阻塞的接受方式来等待一个 Go 协程的运行结束。package mainimport "fmt"
import "time"// 这是一个我们将要在 Go 协程中运行的函数。`done` 通道
// 将被用于通知其他 Go 协程这个函数已经工作完毕。
func worker(done chan bool) {fmt.Print("working...")time.Sleep(time.Second)fmt.Println("done")// 发送一个值来通知我们已经完工啦。done <- true
}func main() {// 运行一个 worker Go协程,并给予用于通知的通道。done := make(chan bool, 1)go worker(done)// 程序将在接收到通道中 worker 发出的通知前一直阻塞。<-done
}

通道方向

// 当使用通道作为函数的参数时,你可以指定这个通道是不是
// 只用来发送或者接收值。这个特性提升了程序的类型安全性。package mainimport "fmt"// `ping` 函数定义了一个只允许发送数据的通道。尝试使用这个通
// 道来接收数据将会得到一个编译时错误。
func ping(pings chan<- string, msg string) {pings <- msg
}// `pong` 函数允许通道(`pings`)来接收数据,另一通道
// (`pongs`)来发送数据。
func pong(pings <-chan string, pongs <-chan string) {msg := <-pingspongs <- msg
}func main() {pings := make(chan string, 1)pongs := make(chan string, 1)ping(pings, "passed message")pong(pings, pongs)fmt.Println(<-pongs)
}

通道选择器

package mainimport "time"
import "fmt"func main() {// 在我们的例子中,我们将从两个通道中选择。c1 := make(chan string)c2 := make(chan string)// 各个通道将在若干时间后接收一个值,这个用来模拟例如// 并行的 Go 协程中阻塞的 RPC 操作go func() {time.Sleep(time.Second * 1)c1 <- "one"}()go func() {time.Sleep(time.Second * 2)c2 <- "two"}()// 我们使用 `select` 关键字来同时等待这两个值,并打// 印各自接收到的值。for i := 0; i < 2; i++ {select {case msg1 := <-c1:fmt.Println("received", msg1)case msg2 := <-c2:fmt.Println("received", msg2)}}
}

Go基础天天练之通道相关推荐

  1. 个人计算机更新主要基于,计算机基础知练识习题.doc

    计算机基础知练识习题 计算机基础知识练习题-1 一.选择题 1.CPU的中文含义是( ). A.主机 B.中央处理单元 C.运算器 D.控制器 2.负责指挥与控制整台电子计算机系统的是( ). A.输 ...

  2. 与人斗,其乐无穷!- 职场做人天天练 ! [推荐]

    与人斗,其乐无穷!- 职场做人天天练   转贴天涯高人写的管理与资治通鉴,比较受启发,也有很多自己深切的体会与之共鸣,特整理转贴出来供家人参考. 序 为什么写? ------------------- ...

  3. 使用原生js,写了一个心算口算天天练

    代码不基于任何库,可以直接复制使用改进. <!DOCTYPE html> <html lang="en"> <head><meta cha ...

  4. C++天天练——员工工资

    C++天天练[day4],本专栏日更,会更新一天的题目,难度会逐渐升级,主要目的是为大众练手.刷手速.保持手感.学习知识而生的 day4题: 题目:工资 难度:简单 一般做题时间: 40秒 请编写一个 ...

  5. c#.net淘宝客基础api练手日记

    下载地址: 最新淘宝客C#.NET基础API代码和SDK https://download.csdn.net/download/cplvfx/10643458 淘宝客基础api练手日记 第一步:SDK ...

  6. C++天天练——油耗

    C++天天练[day5],本专栏日更,会更新一天的题目,难度会逐渐升级,主要目的是为大众练手.刷手速.保持手感.学习知识而生的 day5题: 题目:油耗 难度:简单 一般做题用时:30秒 给定一个汽车 ...

  7. 怎样打好古筝基础,练好基本功?

    基础和基本功是一个整体的概念,有其相近的具体内容,不可能是一个或几个概念就能包含了的事,他总在发展,总需要我们学习,并且需要综合的学习,没有一劳永逸的事.单独把什么什么算作基本功,认为会了这些就能弹好 ...

  8. IBM Websphere MQ 基础4:Channel通道与MQ间消息传输

    概念 WebSphere® MQ uses two different types of channels: A message channel, which is a unidirectional ...

  9. MATLAB基础图形处理实现图形通道转换灰度化旋转缩放镜像拼接

    %practice,还是以彩色荷花图片lotus为例 %读入图片数据 Image1=imread('carphone.jpg');%图片1是原图,汽车与手机JPG格式的原图 %红绿通道互换 Image ...

最新文章

  1. QT:(4)解决在VS15下配置QT后没有QT GUI Application选项
  2. 高通首次推出AI引擎 打包所有软硬件算力
  3. 软件驱动安装在docker_docker 安装软件
  4. linux定时任务crontab
  5. 常见.Net 英文专业词汇收集
  6. CodeForces 474.D Flowers
  7. Windows Media Center .MCL文件代码执行漏洞(MS16-059)
  8. anaconda pandas运行不了_学习python你必须弄懂的 Python、Pycharm、Anaconda 三者之间的关系...
  9. js和python交互_JSShell:一个基于python的交互式Shell
  10. oracle 的wm_concat函数使用
  11. HDMI和DVI的HDCP握手问题分析及其解决方案精粹
  12. fopen无法创建文件_Linux中一切皆文件,除了网卡
  13. 删除已配对的View Security Server、View Replica Server
  14. saga中的saga(A Saga on Sagas) - balavatasky - 博客园
  15. web前端简易制作之HTML
  16. 3月第4周网络安全报告:境内76.2万个主机感染病毒
  17. 数据预处理01_脏数据产生的原因
  18. Golang的单引号、双引号与反引号用法
  19. 护眼灯真的可以保护眼睛吗?推荐五款达到护眼级别的灯
  20. 【PC工具】Samsung Magician三星固态硬盘优化维护工具升级,固态硬盘选型

热门文章

  1. codeforces 463D Gargari and Permutations
  2. 单独编译和使用webrtc音频降噪模块(NS)
  3. MathType 6.9 安装提示关闭软件再试一次
  4. Puppy linux的引导安装问题
  5. ya的意思_请问ya是你的意思吗,为什么不写成yo – 手机爱问
  6. 在斩获“数据金羊毛”的途中,易观造船现行,人称Argo号~
  7. CSDN怎么转载他人博客
  8. 优先使用TimeUnit类中的sleep()(转自 ImportNew - 刘志军 翻译自 javarevisited)
  9. 人大金仓KingbaseES数据库管理入门
  10. i5 1135G7和R5 5600H 选哪个好