定义
channel 是协程的通信机制。
片段示例
// 定义
ch := make(chan int)
// 读取,写入
ch <- x // 发送到 ch
x = <-ch // ch 中的值赋值到变量
<-ch // 删除 ch 中的值
// 关闭操作
close(ch)
4 种情况
- 不带缓存的 Channels
- 串联的 Channels
- 单方向的 Channels
- 带缓存的 Channels
如果 channel 的缓存是满的,则引发的结果是阻塞。
完整示例
- 不带缓存的 Channel 使用
func main() {
conn, err := net.Dial("tcp", "localhost:8000")
if err != nil {
log.Fatal(err)
}
done := make(chan struct{})
go func() {
io.Copy(os.Stdout, conn)
log.Println("done")
done <- struct{}{}
}()
mustCopy(conn, os.Stdin)
conn.Close()
<-done
}
- 串联的 Channels
func main() {
naturals := make(chan int)
squares := make(chan int)
go func() {
for x := 0; ; x++ {
naturals <- x
}
}()
go func() {
for {
x := <-naturals
squares <- x*x
}
}()
for {
fmt.Println(<-squares)
}
}
- 单方向的 Channels
func counter(out chan<- int) {
for x := 0; x<100; x++ {
out <- x
}
close(out)
}
func squarer(out chan<- int, in <-chan int) {
for v := range in {
out <- v*v
}
close(out)
}
func printer(in <-chan int) {
for v := range in {
fmt.Println(v)
}
}
func main() {
naturals := make(chan int)
squares := make(chan int)
go counter(naturals)
go squarer(squares, naturals)
printer(squares)
}
- 带缓存的 Channels
func mirroredQuery() string {
responses := make(chan string, 3)
go func() { responses <- request("asia.gopl.io") }()
go func() { responses <- request("europe.gopl.io") }()
go func() { responses <- request("americas.gopl.io") }()
return <-responses
}
func request(hostname string) (response string){...}