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 +0x1a
Avoid 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
- 359