面向对象有多态,golang也不能落后啊,哈哈.还是从C++的简单猫开始.

  1. package main
  2. import "fmt"
  3. // 这个和其他语言的 interface (接口)一样一样的,也和php一样,
  4. // 比如一定要实现interface的所有方法,才算实现这个 interface
  5. // 这个interface一共有3个方法,要实现这个 interface,
  6. type Animal interface {
  7. Sleep()
  8. Age() int
  9. Type() string
  10. }
  11. type Cat struct {
  12. MaxAge int
  13. }
  14. func (c *Cat) Sleep() {
  15. fmt.Println("Cat need sleep")
  16. }
  17. func (c *Cat) Age() int {
  18. return c.MaxAge
  19. }
  20. func (c *Cat) Type() string {
  21. return "Cat"
  22. }
  23. //测试一下trait
  24. type Trait struct {
  25. Name string
  26. }
  27. type Dog struct {
  28. MaxAge int
  29. Trait
  30. }
  31. func (d *Dog) Sleep() {
  32. fmt.Println("Dog need sleep")
  33. }
  34. func (d *Dog) Age() int {
  35. return d.MaxAge
  36. }
  37. func (d *Dog) Type() string {
  38. return "Dog"
  39. }
  40. //工厂
  41. func Factory(name string) Animal {
  42. switch name {
  43. case "dog":
  44. return &Dog{MaxAge: 20, Trait: Trait{"abt"}}
  45. case "cat":
  46. return &Cat{MaxAge: 10}
  47. default:
  48. panic("No such animal")
  49. }
  50. }
  51. func testPanic() {
  52. defer func() {
  53. if r := recover(); r != nil {
  54. fmt.Println("Recovered in testPanic", r)
  55. }
  56. }()
  57. gPanic()
  58. // 以下代码会被打印的
  59. fmt.Println("execute in testPanic")
  60. }
  61. func gPanic() {
  62. panic("panic from gPanic")
  63. fmt.Println("recover from panic")
  64. }
  65. func main() {
  66. //1、Defer类似Java中finally
  67. //使用过程中,defer类似Java中finally,即使panic(即java中 throw exception),依然能够执行
  68. //
  69. //2、panic 只能在本 goroutine 处理
  70. //若尝试在main中recover goroutine中panic,将无法达到预期,程序仍然会结束,所以不会执行 a.Age()
  71. //比较 testPanic 和 a.Age() 就可以看出来
  72. //
  73. //3、recover 只能在 defer 中有效
  74. //golang的要求,recover只能写在defer中
  75. //
  76. //4、多使用recover除占用cpu外,不会影响服务正常
  77. //如果函数没有 panic,调用 recover 函数不会获取到任何信息,也不会影响当前进程。
  78. defer func() {
  79. if r := recover(); r != nil {
  80. fmt.Printf("捕获到的错误:%s\n", r)
  81. }
  82. }()
  83. animal := Factory("dog")
  84. animal.Sleep()
  85. fmt.Printf("%s max age is: %d \n", animal.Type(), animal.Age())
  86. // 这个可以恢复
  87. testPanic()
  88. // 以下代码会触发 panic.
  89. a := Factory("tiger")
  90. a.Age();
  91. }

分类: web

标签:   golang