golang channel通道基础

文章发布于 2023-08-24

golang channel 通道是用与协程之间通信的。读取不写、只写不读都会发生阻塞。

创建通道

语法

var name chan type
name := make(chan type ,num) //num 指定通道数

无缓冲通道

不指定容量就是无缓冲通道,无缓冲 channel 通道的发送与接收操作,一定要放在两个不同的 Goroutine 协程中进行,否则会发生 deadlock 死锁。

//无缓冲通道需要读取和写入都同时准备就绪。
func main(){
    //make创建通道时,不指定通道数就是无缓冲通道
    ch := make(chan int)
    go func(ch chan int){
        ch <- 1
    }(ch)
    s:=<- ch
    fmt.Println(s)
}

缓冲通道

ch := make(chan int ,5)

只读通道

只用于接收的channel通道

<- chan int
// read函数专用于读取ch通道的内容
func read(ch <- int) {
    <- ch
}

只写通道

只用于发送的channel通道

//参数
chan <- int
//write 专用于往ch通道写入内容
func write(ch chan <- int) {
    ch <- 1
}

关闭管道

close关闭管道。关闭管道之后,任然可以读取该管道。

ch := make(chan int,1)
ch<- 100
close(ch)
fmt.Println(<-ch) // 100