通道--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"时,会产生阻塞,由于没有设置并行接收器,所以会一直等待

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章