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)