goroutine 语句执行和函数执行的不同行为

谁能解释以下关于 goroutine 的两个调用之间的区别?


方法一

fmt.Println("Starting srv")

go LOGGER.Error(srv.ListenAndServe())

fmt.Println("Starting intSrv")

go LOGGER.Error(intSrv.ListenAndServe())

执行“Starting srv”后停止


方法二

go func() {

    fmt.Println("Starting srv")

    srv.ListenAndServe()

}()


go func() {

    fmt.Println("Starting intSrv")

    intSrv.ListenAndServe()

}()

这将执行“Starting srv”和“Starting intSrv”


为什么行为不同?


千巷猫影
浏览 69回答 2
2回答

红颜莎娜

go LOGGER.Error(srv.ListenAndServe())上面的语句首先计算参数LOGGER.Error(),然后创建一个 goroutine 并运行LOGGER.Error()。然而,srv.ListenAndServe一去不复返。

GCT1015

Goroutine 函数参数在调用 Goroutine 中进行评估。在以下声明中:go LOGGER.Error(srv.ListenAndServe())srv.ListenAndServe()在启动 goroutine 之前计算表达式以记录错误。srv.ListenAndServe()直到服务器退出(因为服务器已停止或侦听器遇到错误),调用才会返回。使用此代码启动服务器并记录从服务器返回的错误。go func() { LOGGER.Error(srv.ListenAndServe()) }()
打开App,查看更多内容
随时随地看视频慕课网APP