Go-通道(channel)学习

通道(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)
    }
}
posted @ 2020-05-22 10:01  mustard22  阅读(189)  评论(0编辑  收藏  举报