Writing a good program
Panic Joke
Hello, guys after a long time, I'm a writing my next blog called panic is an art.
I will start in a moment. But First we revise our knowledge, it is mandatory for this article.
Defer: As you know defer means free your resources or clean your memory before quite. You already know defer statement will change program execution. Defer statement work in LIFO order. Multiple defer functions call gorounties. Goroutines are different from normal flow, it's look similar jump command in assembly language. I will show you how to play with goroutines.
Panic: Panic is a built-in function, provide by golang language. Panic is just like exceptions, however exception concepts are not using in golang. Panic is very useful in debugging.
panic(error). Panic is also very useful when rare condition maybe or may not be possible. Panic and defer follow side by side. If you crash your program, compiler tell
func g() // error in line 3 etc
func f()
func main()
Recover: If you want to solve exceptions in java or c++, you familiar about try catch block. Here in golang, recover is to regain normal flow of program, after crash or panic state.
if r := recover(); r != nil{ // code }
Code</>:
package mainimport ("fmt")func main() {f(4)}func f(n int)(){for ; n != -1; n-- {fmt.Println(n)}if n == -1{fmt.Println("panic")panicState(n)}}func panicState(n int){defer func(){if p := recover(); p!= nil{fmt.Println(p)}fmt.Println("normal execution end")}()g(n)}func g(n int){for i :=0; i < 5; i++{n+=1fmt.Println(n)}}
package main import ( "fmt" ) type Person struct{ name string } func main() { var stds Person var name string = "ali" s := handle(&stds) (*s).name = name fmt.Println((*s).name) } func handle(std *Person)(*Person){ defer func(){ if t := recover(); t != nil { fmt.Println("recovering") panic(t) } }() return std }
Have a great day.
Comments
Post a Comment