golang的channel⽆缓存和有缓存的区别ch:=make(chan int,n)
有缓存:ch <- j 执⾏n次后会卡主,等待<-ch,即可以存n个值
⽆缓存:先执⾏ch <- j 会卡主,等待有<-ch,可以理解为ch能存值,ch <- j 瞬间给<-ch,
实验:
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int, 2)
/
/ch := make(chan int)
over := make(chan bool)
go func() {
for i := 1; ; i++ {
fmt.Println("GoforSTART", i)高一历史必修一思维导图
大学生防骗
time.Sleep(time.Second * 2)
fmt.Println("-------wait 2 cond---------")
j, ok := <-ch
if ok {
fmt.Println("received ", j)
} el {
fmt.Println("received all jobs")
over <- true
return
}
}
}()
for j := 1; j <= 3; j++ {
fmt.Println("ready to nting", j)
ch <- j优美的散文文章
fmt.Println("nt job", j)
}
小贱鸡clo(ch)
fmt.Println("nt all jobs,ch is clod")
<-over
}
缓存为2结果:
ready to nting 1
nt value 1
GoforSTART 1
ready to nting 2
nt value 2
ready to nting 3白鲢鱼的做法
-
------wait 2 cond---------
received 1
GoforSTART 2
nt value 3
nt all value,ch is clod
-------wait 2 cond---------
received 2
GoforSTART 3
-------wait 2 cond---------
received 3
苏州介绍GoforSTART 4
蚕的一生-
满天星绕口令------wait 2 cond---------
received all value
可以看出 发了两个值后ch <- j 卡主,等待<-ch。
注释的是⽆缓存的情况,⼤家可以试试,可以发现,ch <- j ⼀直等<-ch ,有<-ch才发值。
形象理解:1、ch是能放n苹果的盘,ch <- 是放苹果,<-ch是拿苹果:
a、盘中没苹果(ch没值):可以放苹果,拿苹果的只能等
b、盘中有苹果,但⼩于n(n>ch值数量>0):放苹果,拿苹果都可以执⾏
c、盘中苹果多于n(ch值数量>n):可以拿苹果,放苹果的只能等
2、如果没有盘(ch⽆缓存),放苹果和拿苹果的,只能⼀⼈给,⼀⼈拿