美文网首页
golang - channel(通道)

golang - channel(通道)

作者: HelloTech | 来源:发表于2020-10-21 09:18 被阅读0次
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

相关文章

网友评论

      本文标题:golang - channel(通道)

      本文链接:https://www.haomeiwen.com/subject/mxksmktx.html