通道(channel)
声明、初始化
1.无缓冲通道
func writeInteger(ch chan int){
ch<- 110
}
var ch1 chan int // ch1 == nil 不能直接使用
ch1 = make(chan int) // 无缓冲通道(初始化时,第二个参数为空或0);写入之前,先准备好接收(读取)。注:写入与读取放到2个不同的goroutine,否则造成阻塞。
go writeInteger(ch1) // 新goroutine进行写入操作
fmt.Println(<-ch1) // 110
2.缓冲通道
// 缓冲通道,当写入次数达到容量时,若不进行读取操作,就会阻塞。
ch2 := make(chan string, 1) // 初始化时,第二个参数(容量)大于0
ch2<- "hello"
ch2<- "world" // 程序阻塞
fmt.Println(<-ch2)
// 注:处理这种情况,要每写入一次且读取一次
// 即:
ch2<- "hello"
fmt.Println(<-ch2)
ch2<- "world"
fmt.Println(<-ch2)
通道遍历
import "fmt"
func fibonacci(mychan chan int) {
n := cap(mychan)
x, y := 1, 1
for i := 0; i < n; i++ {
mychan <- x
x, y = y, x+y
}
// 记得 close 信道
// 不然主函数中遍历完并不会结束,而是会阻塞。
close(mychan)
}
func main() {
pipline := make(chan int, 10)
go fibonacci(pipline)
// 在range时,要确保通道是处于"关闭状态",否则循环会阻塞。
for k := range pipline {
fmt.Println(k)
}
}