golang 中channel 缓存channel 和无缓存ch
2021-04-26 本文已影响0人
顶尖少爷
c1:=make(chan int) 无缓冲
c2:=make(chan int,1) 有缓冲
无缓冲的 不仅仅是 向 c1 通道放 1 而是 一直要有别的携程 <-c1 接手了 这个参数,那么c1<-1才会继续下去,要不然就一直阻塞着
而 c2<-1 则不会阻塞,因为缓冲大小是1 只有当 放第二个值的时候 第一个还没被人拿走,这时候才会阻塞。
有缓冲
var c=make(chan int,1)
fmt.Println("Main going to call hello go goroutine")
go func(c chan int) {
fmt.Println("hello go routine is going to sleep")
time.Sleep(4 * time.Second)
fmt.Println("hello go routine awake and going to write to done")
c<-1
}(c)
<-c
fmt.Println("Main received data")
无缓存区
package main
import (
"fmt"
)
func producer(chnl chan int) {
for i := 0; i < 10; i++ {
chnl <- i
}
close(chnl)
}
func main() {
ch := make(chan int)
go producer(ch)
for v := range ch {
fmt.Println("Received ",v)
}
}