Go语言学习---通道类型
通道(channel)是用来传递数据的一个数据结构。
通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。
操作符 <-
用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。
通道(Channel)是Go语言中一种非常独特的数据结构。它可用于在不同Goroutine之间传递类型化的数据。并且是并发安全的。相比之下,之前几种数据类型都不是并发安全的
Goroutine可以被看作是承载可被并发执行的代码块的载体。它们由Go语言的运行时系统调度,并依托操作系统线程(又称内核线程)来并发地执行其中的代码块。
注意:默认情况下,通道是不带缓冲区的。发送端发送数据,同时必须又接收端相应的接收数据。
不带缓冲区的
ch := make(chan int)
带缓冲区的
带缓冲区的通道允许发送端的数据发送和接收端的数据获取处于异步状态,就是说发送端发送的数据可以放在缓冲区里面,可以等待接收端去获取数据,而不是立刻需要接收端去获取数据。
不过由于缓冲区的大小是有限的,所以还是必须有接收端来接收数据的,否则缓冲区一满,数据发送端就无法再发送数据了
注意:如果通道不带缓冲,发送方会阻塞直到接收方从通道中接收了值。如果通道带缓冲,发送方则会阻塞直到发送的值被拷贝到缓冲区内;如果缓冲区已满,则意味着需要等待直到某个接收方获取到一个值。接收方在有值可以接收之前会一直阻塞。
ch := make(chan int,5)
通道类型的表示方法很简单,仅由两部分组成:
chan T
初始化一个长度为5且元素类型为int的通道值,则需要这样写:
make(chan int, 5)
暂存在通道值中的数据是先进先出。下面声明一个通道类型的变量,并为其赋值:
ch1 := make(chan string, 5)
要向通道ch1 发送字符串"value1",那么应该这样做:
ch1 <- “value1"
如果我们从ch1那里接收字符串,则要这样:
<- ch1
value := <- ch1
通道值的接受操作也可以有第二个结果值:
value, ok := <- ch1 //这里的ok的值是bool类型的。它代表了通道值的状态,true代表通道值有效,而false则代表通道值已无效(或称已关闭)
可以通过函数close来关闭通道:
close(ch1)
实例
package main import "fmt" func main() { ch1 := make(chan string, 5) ch1 <- "s1" ch1 <- "s2" ch1 <- "s3" var v1 = <- ch1 var v2 = <- ch1 var v3 = <- ch1 fmt.Println(v1, v2, v3) }