Panic's & OOP Golang
Outline
- 
	
What panic is ?
 - Avoid Panic
 - Try Catch
 - Try Catch Case
 - OOP Golang
 
What Panic Is ?
Panic is a built-in function that stops the ordinary flow of control and begins panicking
Example 1
Example 2
package main
import (
    "fmt"
)
func Div(num, divisor int) int {
    return num/divisor
}
func main() {
    a := 10
    b := 0
    fmt.Println(Div(a,b))
}package main
import (
    "fmt"
)
type Person struct {
    Name string
    Age int
}
func GetName(p *Person) string {
    return p.Name
}
func main() {	 
    fmt.Println(GetName(nil))
}
Panic Result
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0xffffffff addr=0x0 pc=0xc64da]
goroutine 1 [running]:
main.main()
	/tmp/sandbox914181347/main.go:18 +0x1aAvoid Panic
- Write an Overestimate Code
 - Use Recover
 
Write an Overestimate Code
package main
import (
	"fmt"
)
type Person struct {
    Name string
    Age int
}
func Div(p *Person, divisor int) int {
    if divisor == 0 {
        return 0
    }
    return p.Age/divisor
}
func main() {
    p := &Person{}
    p = nil
    fmt.Println(Div(p,3))
}Use Recover
package main
import (
	"fmt"
)
type Person struct {
    Name string
    Age int
}
func Div(p *Person, divisor int) int {
    return p.Age/divisor
}
func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
        }
    }()
    p := &Person{}
    p = nil
    fmt.Println(Div(p,3))
}Try Catch
Try Catch Taste on Golang
package main
import (
    "log"
    "fmt"
)
type Block struct {
	Try     func()
	Catch   func(Exception)
	Finally func()
}
type Exception interface{}
func (b Block) Do() {
	if b.Finally != nil {
		defer b.Finally()
	}
	if b.Catch != nil {
		defer func() {
			if r := recover(); r != nil {
				b.Catch(r)
			}
		}()
	}
	b.Try()
}
func main () {
    res := 0
    Block {
        Try: func() {
            a := 0
            b := 1
            res = b/a    
        },
        Catch: func(e Exception) {
            log.Println(e)  
        },
        Finaly: func() {
            fmt.Println("finished")
        },
    }.Do()
    fmt.Println(res)
}Try Catch Case
- When use other library ( import from someone git )
 - there is a Block in function that optional, but there is a risk that block make panic
 - There is unknown panic might happened when create a function
 
OOP Golang
- OOP like on Golang
 
Class => Struct
package main
import (
    "fmt"
)
type Person struct {
    name string
}
func (p Person) GetName() string {
    return p.name
}
func main() {
    p := Person{name:"hamdi"}
    fmt.Println(p.GetName())
}Encapsulation
package main
import (
    "fmt"
)
// public
func GetName() string {
    return "hamdi"
}
// private
func updateName(s *string) {
    s = "hamdi"
}Abstrct ( struct ) ?
package main
import (
    "fmt"
)
type Animal interface {
    Walk() int
    Talk() string
}
type Cow struct {
    Leg int
    Weight int
}
type Snake struct {
    Poison bool
    Tall int
}
func (c Cow) Walk() int {
    return 1
}
func (s Snake) Walk() int {
    return 3
}
func (s Snake) Talk() string {
    return "Tsah"
}
func (c Cow) Talk() string {
    return "Mooo"
}
func (c Cow) Run() int {
    return "10"
}
Return abstrct ( struct ) ?
package main
import (
    "fmt"
)
type Animal interface {
    Walk() int
    Talk() string
}
type Cow struct {
    Leg int
    Weight int
}
type Snake struct {
    Poison bool
    Tall int
}
func GetAnimal(s string) Animal {
    if s == "mamal" {
        return Cow{}    
    }
    return Snake{}
}Inheritance ?
package main
import (
    "fmt"
)
type Car struct {
    
}
func (c Car) GetMaxSpeed() int {
    return 120
}
func (c Car) GetWheels() int {
    return 4
}
type ContainerTruck struct {
    Car
    Type string
}
func (c ContainerTruck) GetWheels() {
    return 6
}
type SportCar struct {
    Car
    Type string
}
func (s SportCar) GetMaxSpeed() int {
    return 200
} PANIC
By hamdi ahmadi
PANIC
- 403