1、继承

  1. package main
  2. import "fmt"
  3. //定义父类 Human
  4. type Human struct {
  5. id string
  6. name string
  7. }
  8. //get set 方法-------------------
  9. func (this *Human) getId() string{
  10. return this.id
  11. }
  12. func (this *Human) getName() string {
  13. return this.name
  14. }
  15. func (this *Human) setId(id string) {
  16. this.id = id;
  17. }
  18. func (this *Human) setName(name string) {
  19. this.name = name;
  20. }
  21. // -----------------------------
  22. //普通方法 --------------------------
  23. func (this *Human) Eat() {
  24. fmt.Println("Human.Eat()...")
  25. }
  26. func (this *Human) Walk() {
  27. fmt.Println("Human.Walk()...")
  28. }
  29. // -----------------------------
  30. //定义子类
  31. type SuperMan struct {
  32. Human // superMan 继承 Human
  33. level int
  34. }
  35. //重定义父类方法
  36. func (this *SuperMan) Eat() {
  37. fmt.Println("SuperMan.Eat()...")
  38. }
  39. //子类新方法
  40. func (this *SuperMan) Fly() {
  41. fmt.Println("SuperMan.Fly()...")
  42. }
  43. func main() {
  44. h := Human{"1","张三"}
  45. fmt.Println(h.getName())
  46. h.Eat()
  47. h.Walk()
  48. s := SuperMan{Human{"2","李四"},2}
  49. fmt.Println(s.getName())
  50. s.getName()
  51. s.Eat()
  52. s.Walk()
  53. s.Fly()
  54. }

2、多态

  1. package main
  2. import "fmt"
  3. //实际是一个指针
  4. type AnimalIF interface {
  5. sleep()
  6. GetColor() string//获取动物颜色
  7. GetType() string//获取动物类型
  8. }
  9. //定义一个类,必须实现接口所有的方法,才算实现
  10. type Cat struct {
  11. color string
  12. }
  13. func (this *Cat) sleep() {
  14. fmt.Println("喵睡觉")
  15. }
  16. func (this *Cat) GetColor() string{
  17. return this.color
  18. }
  19. func (this *Cat) GetType() string{
  20. return "喵喵"
  21. }
  22. type Dog struct {
  23. color string
  24. }
  25. func (this *Dog) sleep() {
  26. fmt.Println("汪睡觉")
  27. }
  28. func (this *Dog) GetColor() string{
  29. return this.color
  30. }
  31. func (this *Dog) GetType() string{
  32. return "汪汪"
  33. }
  34. func showAnimal(an AnimalIF) {
  35. an.sleep()
  36. fmt.Println(an.GetColor())
  37. fmt.Println(an.GetType())
  38. }
  39. func main() {
  40. var an AnimalIF
  41. an = &Cat{"blue"}
  42. an.sleep()
  43. fmt.Println(an.GetColor())
  44. fmt.Println(an.GetType())
  45. showAnimal(&Dog{"yellow"})
  46. }

3、interface

go | 13 继承、多态 - 图1

  1. package main
  2. import "fmt"
  3. func myFunc(a interface{}) {
  4. fmt.Println(a)
  5. //interface{} 如何区分引用的底层数据类型是什么
  6. //给 interface{} 提供“类型断言”的机制
  7. value,ok := a.(string)
  8. if !ok{
  9. fmt.Println("not string type")
  10. }else{
  11. fmt.Println("string type")
  12. fmt.Printf("%T\n",value)
  13. }
  14. }
  15. type miao struct {
  16. cc string
  17. }
  18. func main() {
  19. m := miao{"ccc"}
  20. myFunc(m)
  21. myFunc("aaa")
  22. }