如果说 goroutine 是 go 语言程序的并发体的话,那么 channel 则是他们之间通信机制。一个 channel 是一个通信机制,他能够让一个 goroutine 通过它给另一个 goroutine 发送值信息。每个 channel 都有一个非凡的类型,也就是 channels 能够发送数据类型。一个能够发送 int 类型数据的 channel 个别写为 chan int。
应用内置函数 make,来创立 channel
ch := make(chan int)
和 map 相似,channel 也对应一个 make 创立的底层数据结构的援用。当咱们复制一个 channel 或用于函数参数传递时,咱们只是拷贝一个 channel 援用,因而调用者和被调用者都援用同一个 channel。和其余的援用类型一样,channel 的零值也是 nil
ch<-x
x = <-ch
<-ch
close(ch)
ch = make(chan int,3)
不带缓存的 channels
一个基于无缓存 channels 的发送操作将导致发送者 goroutine 阻塞。直到另一个 goroutine 在雷同的 channel 上继续执行操作接管,当发送的值通过 channels 胜利传输之后,两个 goroutine 能够继续执行前面的语句、反之,如果接管操作产生,那么接收者 goroutine 也将阻塞,晓得有另一个 goroutine 在雷同的 channels 上执行发送操作。
串联的 Channels(pipelone)
channel 也能够用于将多个 goroutine 链接在一起,一个 channel 的输入作为下一个 channel 的输出。这种串联的 channel 就是所谓的通道
package main
import ("fmt")
func main() {func main() {naturals := make(chan int)
squares := make(chan int)
// Counter
go func() {
for x := 0; x < 100; x++ {naturals <- x}
close(naturals)
}()
// Squarer
go func() {
for x := range naturals {squares <- x * x}
close(squares)
}()
// Printer (in main goroutine)
for x := range squares {fmt.Println(x)
}
}
}