💬Что такое паника (panic) в Go? Какие операции автоматически возвращают панику и останавливают программу?



📌Паники относятся к категории ошибок, которые не ожидались разработчиком. Паника похожа на исключения в других ЯП и предназначена только для ошибок времени выполнения, например:



🔸Доступ к индексу за пределами массива/среза: попытка доступа к элементу массива или среза по индексу за пределами его размера приведет к панике.



arr := []int{1, 2, 3}

fmt.Println(arr[5])
// panic: runtime error: index out of range



🔸Type assertion:

неправильное приведение типа с помощью type assertion может вызвать панику.



var i interface{} = "hello"

fmt.Println(i.(int))
// panic: interface conversion: interface {} is string, not int



🔸Закрытие закрытого канала:

попытка закрыть уже закрытый канал вызовет панику.



ch := make(chan int)

close(ch)

close(ch)
// panic: close of closed channel



📌Обработка паники



Для обработки паники в Go используется конструкция recover. Recover возвращает значение, переданное функции panic, если вызов recover происходит в той же горутине, что и panic. Это часто используется в сочетании с defer, чтобы обеспечить обработку паники и предотвратить завершение всей программы.



func main() {

defer func() {

if r := recover(); r != nil {

fmt.Println("Recovered from panic:", r)

}

}()

causePanic()

fmt.Println("This line will not be reached")

}



func causePanic() {

panic("This is a panic")

}




Если функция causePanic вызывает панику, функция defer будет вызвана перед завершением программы. Функция recover затем используется для захвата значения паники и предотвращения завершения программы.



👉 Подробнее