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(){}()  这又是什么语法?
阅读 6.1k
5 个回答
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信号处理。

<-forerver就是从channel里取数据,这里由于channel是空的,所以会产生阻塞。
go func(){}()就是一个立即执行的匿名函数。

go func(){}()

是启动一个goroutine, go的协程, 来执行后边的func

看下入门教程就好了

"<-forerver" 这是什么语法?引用
这句语法的意思等待其他routine向forever这个channel中传递值,通过这种方式来阻塞<-forerver语句所在的routine的退出,一旦有其他routine向forerver中传入值,<-forerver语句所在的routine就会解除阻塞,继续向下执行代码

go func(){}() 这又是什么语法?引用
这条语句的意思是新生成一个routine去执行func(){}这个函数的逻辑

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题