通道--golang

通道(channels) 是连接多个协程的管道,可以从一个协程将值发送到通道,然后在另一个协程中接收,由关键字chan定义
使用 make(chan val-type)创建一个新的通道。 通道类型就是需要传递值的类型
发送:channel <- info 发送 一个新的值到通道中
接收:<-channel

通道的两种类型:无缓冲(默认)、有缓冲

例子1 :无缓冲通道,并发接收

package main

import (
    "fmt"
)

func main() {
    message := make(chan string) //无缓冲通道
    go func() {
        message <- "ping" //channel <- 语法 发送 一个新的值到通道中
        message <- "hhh"
    }()
    msg := <-message // <-channel 语法从通道中 接收 一个值
    fmt.Println(msg)
    msg2 := <-message 
    fmt.Println(msg2)
}

结果


例子2:有缓冲通道,无需设置并发

package main

import "fmt"

func main() {
    messages := make(chan string, 2) //由于此通道是有缓冲的, 因此我们可以将这些值发送到通道中,而无需并发的接收。

    messages <- "buffered"
    messages <- "channel"

    fmt.Println(<-messages)
    fmt.Println(<-messages)
}

例子3:常见报错, fatal error: all goroutines are asleep - deadlock!

package main

import "fmt"

func main() {
    messages := make(chan string) //这次不设置缓冲

    messages <- "buffered"

    fmt.Println(<-messages)
}

会报错: fatal error: all goroutines are asleep - deadlock!
make(chan string),开辟的通道是一种无缓冲通道,所以当对这个缓冲通道写的时候,会一直阻塞等到某个协程对这个缓冲通道读,所以执行到messages <- "buffered"时,会产生阻塞,由于没有设置并行接收器,所以会一直等待

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容