defer и panic

Последнее обновление: 21.01.2017

defer

Оператор defer позволяет выполнить определенную функцию в конце программы, при этом не важно, где в реальности вызывается эта функция. Например:

package main
import "fmt"

func main() {
	defer finish()
	fmt.Println("Program has been started")
	fmt.Println("Program is working")
}

func finish(){
	fmt.Println("Program has been finished")
}

Здесь функция finish вызывается с оператором defer, поэтому данная функция в реальности будет вызываться в самом конце выполнения программы, несмотря на то, что ее вызов определен в начале функции main. В частности, мы получим следующий консольный вывод:

Program has been started
Program is working
Program has been finished

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

package main
import  "fmt"

func main() {
     
	defer finish()
	defer fmt.Println("Program has been started")
	fmt.Println("Program is working")
}

func finish(){
	fmt.Println("Program has been finished")
}

Консольный вывод:

Program is working
Program has been started
Program has been finished

panic

Оператор panic позволяет сгенерировать ошибку и выйти из программы:

package main
import "fmt"

func main() {
	fmt.Println(divide(15, 5))
	fmt.Println(divide(4, 0))
	fmt.Println("Program has been finished")
}
func divide(x, y float64) float64{
	if y == 0{ 
		panic("Division by zero!")
	}
	return x / y
}

Оператору panic мы можем передать любое сообщение, которое будет выводиться на консоль. Например, в данном случае в функции divide, если второй параметр равен 0, то осуществляется вызов panic("Division by zero!").

В функции main в вызове fmt.Println(divide(4, 0)) будет выполняться оператор panic, поскольку второй параметр функции divide равен 0. И в этом случае все последующие операции, которые идут после этого вызова, например, в данном случае это вызов fmt.Println("Program has been finished"), не будут выполняться. В этом случае мы получим следующий консольный вывод:

3
panic: Division by zero!

И в конце вывода будет идти диагностическая информация о том, где возникла ошибка.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850