侦听和服务的Goroutine阻止主进程的执行,永远不会达到用于通信的以下选择状态

侦听和服务的Goroutine阻止主进程的执行,永远不会达到用于通信的以下选择状态,go,concurrency,websocket,server,goroutine,Go,Concurrency,Websocket,Server,Goroutine,我仍然全神贯注于goroutines和Channel,所以我可能做了一些明显错误的事情。我有一个运行websocket服务器的服务和用于将客户端从https升级到wss的公共路由。我试图为其中一个例程附加一些分解代码,但是第二个go调用似乎会阻止主函数的执行。开机时,我在控制台上找到Println 5。我的程序的其余部分正在愉快地工作。我只是不能用ctrl+C来杀死它(也不能在手动关闭后将其拆除) 以下是相关代码(完整的主文件减去streamAddr变量和导入): func main(){ fm

我仍然全神贯注于goroutines和Channel,所以我可能做了一些明显错误的事情。我有一个运行websocket服务器的服务和用于将客户端从https升级到wss的公共路由。我试图为其中一个例程附加一些分解代码,但是第二个
go
调用似乎会阻止主函数的执行。开机时,我在控制台上找到Println 5。我的程序的其余部分正在愉快地工作。我只是不能用ctrl+C来杀死它(也不能在手动关闭后将其拆除)

以下是相关代码(完整的主文件减去streamAddr变量和导入):

func main(){
fmt.Println(1)
flag.Parse()
log.SetFlags(0)
fmt.Println(2)
中断:=接通(切换操作信号,1)
信号通知(中断,操作系统中断)
fmt.Println(3)
hub:=socktools.NewHub()
转到hub.Run()
fmt.Println(4)
http.HandleFunc(“/stream”,func(w http.ResponseWriter,r*http.Request){
socktools.ServeWs(轮毂,w,r)
})
fmt.Println(5)
go log.Fatal(http.ListenAndServe(*streamAddr,nil))
fmt.Println(6)
挑选{

case您实际上是在调用
go log.Fatal(variable)
,因此异步调用是
log.Fatal
,但它必须知道此时
变量是什么,因此它首先必须调用
http.listenandservice
以查看返回的内容。但是
http.listenandservice
会阻塞

您需要执行以下操作:

go func() {
    log.Fatal(http.ListenAndServe(*streamAddr, nil))
}()

实际上,您正在调用
go log.Fatal(variable)
,因此异步调用是
log.Fatal
,但它必须知道此时
变量是什么,因此它首先必须调用
http.ListenAndServe
以查看返回的内容。但是
http.ListenAndServe
会阻塞

您需要执行以下操作:

go func() {
    log.Fatal(http.ListenAndServe(*streamAddr, nil))
}()

谢谢!我就知道是这样的疏忽。谢谢!我就知道是那样的疏忽。