1、声明
var ch chan int
fmt.Println(ch) // nil
ch = make(chan int)
ch1 := make(chan bool)
ch2 := make(chan string)
2、操作
- 发送
<-
: 将数据发送到通道中 - 接收
<-
:从一个通道中接收值 - 关闭
// 发送
ch<-10
// 接收
x := <-ch
// 关闭
close(ch)
3、无缓冲
和有缓冲
channel
- 以下执行后会阻塞:创建了一个无缓冲通道,并且有向发送数据,但是没有接收者,导致阻塞
func main() {
ch := make(chan int)
ch <- 10 // 这行代码会阻塞
fmt.Println("发送成功")
}
- 已经代码可以正常执行:有接收和发送
func main() {
ch := make(chan int)
go func(){
ch <-10
}()
x := <-ch
fmt.Println(x)
}
- 创建有缓冲channel
chCache := make(chan int,10) // 缓冲10个int数据
- 以下代码在 ch 缓冲到三个int数据后就会阻塞,直到有接收者
// 抛出:fatal error: all goroutines are asleep - deadlock!
func main() {
ch := make(chan int, 3)
for i := 1; i < 6; i++ {
ch <- i
}
}
- 以下代码可以正常执行
func main() {
ch := make(chan int, 3)
go func() {
for i := 0; i < 2; i++ {
index := <-ch
fmt.Println(index)
}
}()
for i := 0; i < 5; i++ {
ch <- i
}
}
4、关闭通道
i,ok := <-ch // 关闭通道后 ok=false
总结:
1、chan是一种引用类型,它的零值是 nil
2、声明的通道后需要使用make函数初始化后才能使用
3、通过内置的close函数关闭通道,但不是必须的,因为channel可以被垃圾回收机制回收
4、向一个已关闭的channel发送数据会导致panic
5、对一个channel进行接收,会一直获取值,直到通道为空
6、对一个关闭的并且没有值的通道接收会得到对应类型的零值
7、关闭一个已关闭的channel会导致panic
有疑问加站长微信联系(非本文作者)