Z
ZHANK
并发编程

Channel 通道

make(chan T) 创建、<- 发送/接收、缓冲/无缓冲、close

Channel 通道

Channel 是 goroutine 之间通信的管道——遵循 CSP(Communicating Sequential Processes)模型:不要通过共享内存通信,而要通过通信共享内存。

学完本章你将: 掌握 make(chan T)、<- 发送/接收、缓冲/无缓冲、close。


创建与使用

go
package main

import "fmt"

func main() {
    // 创建无缓冲 channel(同步)
    ch := make(chan string)

    go func() {
        ch <- "Hello"  // 发送——阻塞直到有人接收
    }()

    msg := <-ch  // 接收——阻塞直到有人发送
    fmt.Println(msg)  // "Hello"
}

缓冲 channel

go
// 缓冲容量 2——不阻塞直到缓冲区满
ch := make(chan int, 2)

ch <- 1  // 不阻塞
ch <- 2  // 不阻塞
// ch <- 3  // 阻塞!缓冲区满了

fmt.Println(<-ch)  // 1
fmt.Println(<-ch)  // 2

close 关闭通道

go
ch := make(chan int, 3)
ch <- 1
ch <- 2
close(ch)

// range 遍历通道直到关闭
for v := range ch {
    fmt.Println(v)  // 1 2
}

// 判断是否关闭
v, ok := <-ch  // ok=false 表示已关闭且为空

单向 channel

go
// 只发 channel
func send(ch chan<- int) { ch <- 42 }

// 只收 channel
func receive(ch <-chan int) { fmt.Println(<-ch) }

ch := make(chan int)
go send(ch)
receive(ch)