1.什么是Channel?
通道是Go中自带的、唯一一个可以满足并发安全性的类型。通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。
2.channel类型
var 变量 chan 元素类型
举几个例子: var ch1 chan int // 声明一个传递整型的通道 var ch2 chan bool // 声明一个传递布尔型的通道 var ch3 chan []int // 声明一个传递int切片的通道
声明的通道需要使用make函数初始化后才能使用 make(chan 元素类型, [缓冲大小]) // channel的缓冲大小是可选的。
举几个例子: ch4 := make(chan int) ch5 := make(chan bool) ch6 := make(chan []int)
通道有发送(send)、接收(receive)和关闭(close)三种操作。发送和接收都使用<-符号。
定义一个通道 ch := make(chan int) 将一个值发送到通道中。 ch <- 10 // 把10发送到ch中 从一个通道中接收值。 x := <- ch // 从ch中接收值并赋值给变量x <-ch // 从ch中接收值,忽略结果
我们通过调用内置的close函数来关闭通道。 close(ch)
关于关闭通道需要注意的事情是,只有在通知接收方goroutine所有的数据都发送完毕的时候才需要关闭通道。通道是可以被垃圾回收机制回收的,它和关闭文件是不一样的,在结束操作之后关闭文件是必须要做的,但关闭通道不是必须的。
关闭后的通道有以下特点:
对一个关闭的通道再发送值就会导致panic。 对一个关闭的通道进行接收会一直获取值直到通道为空。 对一个关闭的并且没有值的通道执行接收操作会得到对应类型的零值。 关闭一个已经关闭的通道会导致panic。
代码示例:
package main
import "fmt"
func main() {
// 声明并初始化了一个元素类型为int、容量为3的通道ch1
ch1 := make(chan int, 3)
// 向该通道先后发送了三个元素值2、1和3
ch1 <- 2
ch1 <- 1
ch1 <- 3
// 语句elem1 := <-ch1会将最先进入ch1的元素2接收来并存入变量elem1
elem1 := <-ch1
fmt.Printf("The first element received from channel ch1: %v\n",elem1)
}

最低0.47元/天 解锁文章
1271

被折叠的 条评论
为什么被折叠?



