golang并发编程之channel
2018-10-23 14:57
701 查看
一、概念
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 } }
相关文章推荐
- Golang从入门到精通(十九):Golang并发编程之Channel
- Golang并发(三) - Channel
- Golang并发编程——安全传输引用和指针的方法
- golang中并发sync和channel
- golang语言并发与并行——goroutine和channel的详细理解(一)
- golang中并发sync和channel
- golang并发编程的两种限速方法
- golang并发编程的两种限速方法
- golang并发编程的两种限速方法
- golang语言并发与并行—goroutine和channel的详细理解
- golang中并发sync和channel
- Go并发编程之channel
- Golang的channel使用以及并发同步技巧
- Golang从入门到精通(十八):Golang并发编程之Goroutine
- golang语言并发与并行——goroutine和channel的详细理解
- golang并发编程
- Golang并发编程
- Go 并发编程基础(一)goroutine,channel
- golang中并发sync和channel
- golang语言并发与并行——goroutine和channel的详细理解(一)