go channel里的一点疑惑

packagemain
import(
"fmt"
"os"
"time"
)
const(
MAX_REQUEST_NUM=10
CMD_USER_POS=1
)
var(
savechanbool
quitchanbool
reqchan*Request
)
typeRequeststruct{
CmdIdint16
Datainterface{}
}
typeUserPosstruct{
xint16
yint16
}
funcinit(){
req=make(chan*Request,MAX_REQUEST_NUM)
save=make(chanbool)
quit=make(chanbool)
}
funcsaveGame(){
fmt.Println("DosomethingwithSaveGame")
quit<-true
}
funconReq(r*Request){
pos:=r.Data.(UserPos)
fmt.Println(r.CmdId,pos)
}
funchandler(){
for{
select{
case_,ok:=<-save:
//fmt.Println("saving.......")
ifok{
saveGame()
}else{
fmt.Println("channelemptyorclosed")
}
caser,ok:=<-req:
ifok{
onReq(r)
}else{
fmt.Println("reqchanclosed")
os.Exit(0)
}
}
}
}
funcmain(){
//为什么要有quit,quit的作用是什么
newReq:=&Request{
CmdId:CMD_USER_POS,
Data:UserPos{
x:10,
y:20,
},
}
gohandler()
req<-newReq
time.Sleep(time.Millisecond*200)
save<-true
close(req)
<-quit
}
上面这段代码里,如果注释掉
quit<-true
<-quit
结果只能打印1{1020},若保留,则打印1{1020}DosomethingwithSaveGamereqchanclosed没太看懂这里quit的作用。我的想法是,正常给save<-true之后,应该打印DosomethingwithSaveGame啊关闭req之后,也该有reqchanclosed打印啊看来还是理解不到位,go小白,辛苦大神指导下
烙印99
浏览 271回答 2
2回答

一只斗牛犬

main在向save发完true后,几乎立刻就结束了。main一结束,整个程序就结束了,这个时候saveGame很可能还没有机会能后执行。handler里的"reqchanclosed"可能也还没有执行机会。

jeck猫

main这个也是一个协程,和你的程序同步进行,也就是说,你不知道是你的协程先执行完,还是main函数执行完,如果你的协程先执行,那么main还是输出就是你想要的,但是如果是main函数先执行完,那么你的协程是执行了,但是并不会输出了。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript