Как отложить анонимную функцию, возвращаемую функцией - PullRequest
0 голосов
/ 06 июня 2019

Допустим, у вас есть функция, которая устанавливает сервер приложений и возвращает функцию, которая должна быть запущена непосредственно перед выходом из приложения.

func main() {
  defer applicationExit()
}

func applicationExit() func() {
  fmt.Println(" Application Setup Call")

  return func() {
    fmt.Println("Application Tear Down Call")
  }
} 

Вы получите следующий вывод. Output: Application Setup Call

Что пошло не так? Почему мы не видим вывод Application Tear Down Call

Ответы [ 2 ]

5 голосов
/ 06 июня 2019

Ваш код делает именно то, что ожидается:

func main() {
    defer applicationExit()
}

В переводе на английский этот код означает:

  • Подождите, пока не выйдет main, затем позвоните applicationExit().

Вот что происходит.Но вместо этого вы, похоже, хотите:

  • Немедленно выполнить applicationExit() и сохранить возвращаемое значение для дальнейшего использования.
  • Подождите, пока приложение не закроется, затем вызовитеанонимная функция, возвращаемая applicationExit().

Если мы напишем этот фактический код, мы получим что-то вроде:

func main() {
    cleanup := applicationExit() // Call applicationExit() immediately
    defer cleanup() // Wait until main() exits, then call cleanup()
}

, которое может бытьсокращено до:

func main() {
    defer applicationExit()()
}
3 голосов
/ 06 июня 2019

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

func main() {
  defer applicationExit()()
}

func applicationExit() func() {
  fmt.Println(" Application Setup Call")

  return func() {
    fmt.Println("Application Tear Down Call")
  }
} 
...