Все еще полностью разбираюсь в программах и каналах, так что я могу делать что-то явно не так.У меня есть служба, которая запускает сервер веб-сокетов и общий маршрут, используемый для обновления клиентов с https до wss.Я пытаюсь прикрепить некоторый код для одной из подпрограмм, но второй вызов go
, кажется, блокирует выполнение основной функции.Я достигаю Println 5 на консоли при загрузке.Остальная часть моей программы успешно работает.Я просто не могу убить его с помощью ctrl + C (и при этом не требуется, это необходимо разрушить после ручного выключения).
Вот соответствующий код (полный основной файл без минус streamAddr var и импорта):
func main() {
fmt.Println(1)
flag.Parse()
log.SetFlags(0)
fmt.Println(2)
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt)
fmt.Println(3)
hub := socktools.NewHub()
go hub.Run()
fmt.Println(4)
http.HandleFunc("/stream", func(w http.ResponseWriter, r *http.Request) {
socktools.ServeWs(hub, w, r)
})
fmt.Println(5)
go log.Fatal(http.ListenAndServe(*streamAddr, nil))
fmt.Println(6)
select {
case <-interrupt:
fmt.Println("Interrupt heard...")
close(hub.KillChan)
<-hub.KilledChan
fmt.Println("Ending main function")
return
}
}
Почему go log.Fatal(http.ListenAndServe(*streamAddr, nil))
блокируется?Я думал, что ключевое слово go мгновенно сделало его асинхронным?Я здесь неправильно использую?