内容简介:一、概念channel是golang语言级别提供的协程(goroutine)之间的通信方式。goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。那么goroutine之间如何进行数据的通信呢,Go提供了一个很好的通信机制channel。channel可以与Unix shell 中的双向管道做类比:可以通过它发送或者接收值。这些值只能是特定的类型:channel类型。定义一个channel时,也需要定义发送到channel的值的类型。
一、概念
channel是golang语言级别提供的协程(goroutine)之间的通信方式。
goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。那么goroutine之间如何进行数据的通信呢,Go提供了一个很好的通信机制channel。channel可以与Unix shell 中的双向管道做类比:可以通过它发送或者接收值。这些值只能是特定的类型:channel类型。定义一个channel时,也需要定义发送到channel的值的类型。
二、声明方式
var chanName chan ElementType
var ch chan int
使用make,可以指定channel容量
ch = make(chan int)
三、channel得读和写
channel通过操作符<-来接收和发送数据
ch <- v // 发送v到channel ch. 写数据 v := <- ch // 从ch中接口数据,并赋值给v 读数据
默认情况下,channel接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使得Goroutines同步变的更加的简单,而不需要显式的lock。所谓阻塞,也就是如果读取(value := <-ch)它将会被阻塞,直到有数据接收。其次,任何发送(ch<-5)将会被阻塞,直到数据被读出。无缓冲channel是在多个goroutine之间同步很棒的工具。
四、code
package main
import (
"fmt"
"strconv"
)
//定义一个加法函数,传入channel类型,每计算一次,quit加1
func Add(x, y int, quit chan int) {
z := x + y
fmt.Println(z)
//写数据
quit <- 1
}
//接受数据,并赋值给我
func Read(ch chan int) {
value := <- ch
fmt.Println("value" + strconv.Itoa(value))
}
func Write(ch chan int) {
//ch <- 10
}
func main() {
//定义一个channel类型切片数组
chs := make([]chan int, 10)
//循环执行加法函数
for i := 0; i < 10; i++ {
//拿取一个channel
chs[i] = make(chan int)
//执行goroutine和发送一个channel类型数据
go Add(i, i, chs[i])
}
for _, v := range chs {
//接口channel类型数据
<- v
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
算法竞赛入门经典(第2版)
刘汝佳 / 清华大学出版社 / 2014-6-1 / CNY 49.80
《算法竞赛入门经典(第2版)》是一本算法竞赛的入门与提高教材,把C/C++语言、算法和解题有机地结合在一起,淡化理论,注重学习方法和实践技巧。全书内容分为12 章,包括程序设计入门、循环结构程序设计、数组和字符串、函数和递归、C++与STL入门、数据结构基础、暴力求解法、高效算法设计、动态规划初步、数学概念与方法、图论模型与算法、高级专题等内容,覆盖了算法竞赛入门和提高所需的主要知识点,并含有大量......一起来看看 《算法竞赛入门经典(第2版)》 这本书的介绍吧!
MD5 加密
MD5 加密工具
RGB CMYK 转换工具
RGB CMYK 互转工具