golang - channel(通道)

2020-10-21  本文已影响0人  HelloTech
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)
}
chCache := make(chan int,10) // 缓冲10个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

上一篇 下一篇

猜你喜欢

热点阅读