Понимание обработки ошибок в Go: отсрочка, паника и восстановление

Блог Go: отсрочка, паника, восстановление — статья, опубликованная в официальном блоге языка программирования Go. В нем обсуждаются три важных механизма потока управления в Go: defer, panicи recover. Эти механизмы используются для обработки ошибок, управления ресурсами и потока управления в программах Go.

Вот примеры использования defer, panicи recoverв коде Go:

  1. defer:
    Инструкция deferиспользуется для планирования выполнения вызова функции при возврате из окружающей функции. Он часто используется для задач очистки.
func cleanup() {
    fmt.Println("Cleanup task executed!")
}
func main() {
    defer cleanup() // cleanup() will be called when main() returns
    fmt.Println("Main function executing...")
    // Rest of the code
}
  1. panic:
    Функция panicиспользуется для вызова ошибки во время выполнения. Он немедленно останавливает обычный поток выполнения и начинает раскручивать стек, выполняя по пути все отложенные функции.
func main() {
    fmt.Println("Before panic")
    panic("Something went wrong!")
    fmt.Println("After panic") // This line won't be executed
}
  1. recover:
    Функция recoverиспользуется для восстановления контроля над горутиной, находящейся в состоянии паники. Это полезно только внутри отложенных функций. recoverостанавливает последовательность паники и возвращает значение, переданное в функцию panic.
func handlePanic() {
    if r := recover(); r != nil {
        fmt.Println("Recovered from panic:", r)
    }
}
func main() {
    defer handlePanic()
    fmt.Println("Before panic")
    panic("Something went wrong!")
    fmt.Println("After panic") // This line won't be executed
}