Оператор 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 позволяет сгенерировать ошибку и выйти из программы:
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!
И в конце вывода будет идти диагностическая информация о том, где возникла ошибка.