golang - channel(通道)

hellocassiel · · 450 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:hellocassiel

查看原文:golang - channel(通道)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

450 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传