различное поведение при выполнении операторов и функций - PullRequest
0 голосов
/ 19 сентября 2019

Может ли кто-нибудь объяснить разницу между следующими двумя вызовами относительно goroutines?

Метод 1

fmt.Println("Starting srv")
go LOGGER.Error(srv.ListenAndServe())
fmt.Println("Starting intSrv")
go LOGGER.Error(intSrv.ListenAndServe())

Это останавливается после выполнения «Starting srv»

Метод2

go func() {
    fmt.Println("Starting srv")
    srv.ListenAndServe()
}()

go func() {
    fmt.Println("Starting intSrv")
    intSrv.ListenAndServe()
}()

Выполняется "Starting srv" и "Starting intSrv"

Почему поведение отличается?

Ответы [ 2 ]

4 голосов
/ 19 сентября 2019
go LOGGER.Error(srv.ListenAndServe())

Приведенный выше оператор сначала оценивает аргументы для LOGGER.Error(), затем создает программу и запускает LOGGER.Error().Однако srv.ListenAndServe никогда не возвращается.

3 голосов
/ 19 сентября 2019

Параметры функции Goroutine оцениваются в вызывающей goroutine.

В следующем операторе:

go LOGGER.Error(srv.ListenAndServe())

выражение srv.ListenAndServe() вычисляется перед запуском goroutine для регистрации ошибки.Вызов srv.ListenAndServe() не возвращается до тех пор, пока сервер не выйдет (поскольку сервер был остановлен или прослушиватель обнаружил ошибку).

Используйте этот код для запуска сервера и регистрации ошибки, возвращенной с сервера.

go func() { LOGGER.Error(srv.ListenAndServe()) }()
...