type

给类型起别名 相当于 C的typedef

  1. package main
  2. import "fmt"
  3. func main() {
  4. // 给类型起别名
  5. // type 类型名 类型
  6. type INT int
  7. var a INT
  8. fmt.Println(a)
  9. }

定义结构体

  1. package main
  2. import "fmt"
  3. type Person struct {
  4. name string
  5. age int
  6. }
  7. func main() {
  8. var p Person
  9. p.name="JackMa"
  10. p.age=56
  11. fmt.Printf("%+v",p)
  12. }
  1. {name:JackMa age:56}

封装

  1. package main
  2. import "fmt"
  3. type Person struct {
  4. name string
  5. age int
  6. }
  7. // 当前this是对象的拷贝
  8. func (this Person)print() {
  9. fmt.Printf("%#v\n",this)
  10. }
  11. // 如果需要修改值则需要指针
  12. func (this *Person)setValue(name string) {
  13. this.name=name
  14. }
  15. func main() {
  16. var p Person
  17. p.name="JackMa"
  18. p.age=56
  19. fmt.Printf("%+v\n",p)
  20. p.print()
  21. p.setValue("aaaa")
  22. p.print()
  23. }
  1. {name:JackMa age:56}
  2. main.Person{name:"JackMa", age:56}
  3. main.Person{name:"aaaa", age:56}

继承

  1. package main
  2. import (
  3. "fmt"
  4. "reflect"
  5. )
  6. type Animal struct {
  7. }
  8. func (this *Animal)Eat() {
  9. fmt.Printf("Obj:%v Eat\n",reflect.TypeOf(this))
  10. }
  11. func (this *Animal)Drink() {
  12. fmt.Printf("Obj:%v Drink\n",reflect.TypeOf(this))
  13. }
  14. type Dog struct {
  15. // 自动继承 Animal的所有方法
  16. Animal
  17. }
  18. // 重写父类方法
  19. func (this *Dog)Eat() {
  20. fmt.Printf("Obj:%v Eat\n",reflect.TypeOf(this))
  21. }
  22. func main() {
  23. // 创建一个子类对象
  24. dog :=Dog{Animal{}}
  25. // 子类方法
  26. dog.Eat()
  27. // 父类方法
  28. dog.Drink()
  29. }
  1. Obj:*main.Dog Eat
  2. Obj:*main.Animal Drink

多态

  • 接口本质上就是一个指针
  • 如果一个类包含接口的所有方法则默认实现该接口
  • 使用接口实现多态(父对象指针指向子对象)
  1. package main
  2. import (
  3. "fmt"
  4. "reflect"
  5. )
  6. // 定义一个接口
  7. type Pen interface {
  8. Write()
  9. GetColor() string
  10. }
  11. // 一个类实现 interface 中所有方法则自动实现这个接口
  12. type Pencil struct {
  13. color string
  14. }
  15. func (this *Pencil) GetColor() string {
  16. return this.color
  17. }
  18. func (this *Pencil) Write() {
  19. fmt.Printf("Obj:%v Write\n", reflect.TypeOf(this))
  20. }
  21. // 一个类实现 interface 中所有方法则自动实现这个接口
  22. type Chalk struct {
  23. color string
  24. }
  25. func (this *Chalk) GetColor() string {
  26. return this.color
  27. }
  28. func (this *Chalk) Write() {
  29. fmt.Printf("Obj:%v Write\n", reflect.TypeOf(this))
  30. }
  31. func write(pen Pen) {
  32. pen.Write()
  33. }
  34. func main() {
  35. /*
  36. // 父类接口 本质上是一个指针
  37. var pen Pen
  38. pen= &Pencil{"red"}
  39. write(pen)
  40. write(&Chalk{"white"})
  41. */
  42. pencil:=Pencil{"red"}
  43. chalk:=Chalk{"white"}
  44. write(&pencil)
  45. write(&chalk)
  46. }
  1. Obj:*main.Pencil Write
  2. Obj:*main.Chalk Write