💬Что такое паника (panic) в Go? Какие операции автоматически возвращают панику и останавливают программу?
📌Паники относятся к категории ошибок, которые не ожидались разработчиком. Паника похожа на исключения в других ЯП и предназначена только для ошибок времени выполнения, например:
🔸Доступ к индексу за пределами массива/среза: попытка доступа к элементу массива или среза по индексу за пределами его размера приведет к панике.
🔸Type assertion:
неправильное приведение типа с помощью type assertion может вызвать панику.
🔸Закрытие закрытого канала:
попытка закрыть уже закрытый канал вызовет панику.
📌Обработка паники
Для обработки паники в 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
затем используется для захвата значения паники и предотвращения завершения программы.👉 Подробнее