golang - go 有几行代码不懂。求好心人指教
本文介绍了golang - go 有几行代码不懂。求好心人指教的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
forever := make(chan bool)
go func() {
for d := range msgs {
log.Printf("Received a message: %s", d.Body)
}
}()
log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
<-forever
上面这行代码什么意思?
"<-forerver" 这是什么语法?
go func(){}() 这又是什么语法?
解决方案
forever := make(chan bool)
go func() {
for d := range msgs {
log.Printf("Received a message: %s", d.Body)
}
}()
log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
<-forever
修改为:
//此处提取出匿名函数,便于理解
func FUNCTION(msgs Msgs){
for d := range msgs {
log.Printf("Received a message: %s", d.Body)
}
}
forever := make(chan bool) //此处叫channel
go FUNCTION(msg) //go关键字启动一个携程(可以简单理解为轻量级的线程)
log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
<-forever //可以看成从channel中pop一个值,如果没有,则阻塞。
另外,你要是真的想实现CTRL+C执行优雅退出的话,这样写:
forever := make(chan os.Signal)
//监听这么多信号,具体的忘完了。自己查吧。
signal.Notify(forever, os.Interrupt, os.Kill, syscall.SIGINT, syscall.SIGUSR1, syscall.SIGUSR2, syscall.SIGHUP, syscall.SIGTERM)
go func() {
for d := range msgs {
log.Printf("Received a message: %s", d.Body)
}
}()
log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
<-forever
doSomeCleanHere()
比较推荐你看这个代码片段,
因为和题目的几个关键词比较像:协程,协程+匿名函数,channel。
写的比较完善的一个socket-port的proxy,里面有协程的用法,有监听信号的channel,有waitgroup实现协程的控制,系统signal信号处理。
这篇关于golang - go 有几行代码不懂。求好心人指教的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文