channel
定义:通道也是一种引用类型,通道类型的空值是nil
格式如下:
var 变量 chan 元素类型
var a chan int
var b chan string
var c chan bool
通道申明后需要使用make
函数初始化后才能使用。
创建channel的格式如下:
make(chan 元素类型,[缓冲大小])
ch1:=make(chan int,1)
通道操作
发送、接收、关闭三种操作;发送和接收都用<-
符号
发送
ch1<-10
//把10发送到通道ch1中
接收
x:= <- ch1
//从ch1中接收值并赋值给变量x
<- ch1
//从ch1中接收值,忽略结果
关闭
通过内置的close
函数来关闭通道
close(ch1)
注意:只有在通知接收方goroutine所有的数据都发送完毕才需要关闭通道。通道是可以被垃圾回收机制回收的,它和关闭文件不一样,在结束操作后关闭文件是必须的,关闭通道不是必须的
关闭后通道特点
- 对一个关闭的通道再发送值就会导致panic。
- 对一个关闭的通道进行接收会一直获取值直到通道为空。
- 对一个关闭的并且没有值的通道执行接收操作会得到对应类型的零值。
- 关闭一个已经关闭的通道会导致panic。
无缓冲通道
无缓冲通道又称为阻塞通道
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func main() {
ch := make(chan int)
wg.Add(1)
go func() {
defer wg.Done()
x := <-ch
fmt.Println("x:", x)
}()
ch <- 10
fmt.Println("发送成功")
wg.Wait()
}
有缓冲的通道
只要通道的容量大于0就是有缓冲的通道,通道中的容量表示通道能存放元素的数量
package main
import "fmt"
func main() {
ch := make(chan int, 1)
ch <- 10
fmt.Println("发送成功")
a := <-ch
fmt.Println(a)
}