类的表示

表示一个类以及一个方法的方式为:结构体 + 方法

  1. type Hero struct {
  2. Name string
  3. Ad int
  4. Level int
  5. }
  6. // 必须用 *Hero 类型,否则初始化的是一个Hero临时对象
  7. func (h *Hero) SetName(newName string) {
  8. h.Name = newName
  9. }
  10. // 最好也用 * 类型,可免去拷贝开销
  11. func (h *Hero) GetName() string {
  12. return h.Name
  13. }

封装

结构体名、结构体元素名或者方法名的首字母大写,则其他包也能够访问,否则只能在本包中访问。
这也恰好解释了为什么使用fmt.Println()时P要大写了!

继承模拟

go 没有继承,但是可以用语法糖模拟继承。

  1. type Human struct {
  2. name string
  3. sex string
  4. }
  5. func (h Human) Run() {
  6. fmt.Println(h.name, "is running")
  7. }
  8. type SuperMan struct {
  9. Human // SuperMan类继承了Human类的方法
  10. level int
  11. }
  12. func main() {
  13. var s SuperMan
  14. s.name = "li4" // 语法糖,等价于 s.Human.name
  15. s.sex = "male"
  16. s.level = 88
  17. s.Run() // 语法糖,等价于 s.Human.Run()
  18. }

多态模拟

什么是多态?
相同的消息发送给不同的对象,系统根据对象所属类别,引发不同对象产生不同的行为。

golang如何实现多态?
使用 接口 + 结构体 方法来实现多态。
比如定义一个 Animal 有 eat() 和 color() ,通过不同的结构体实现 eat() 和 color() 来定义不同的动物,且具有不同的 eat() 和 color() 实现方式。接口的数据类型为父类指针。

  1. type Animal interface {
  2. eat()
  3. }
  4. type Cat struct {
  5. Name string
  6. }
  7. type Dog struct {
  8. Name string
  9. }
  10. func (c *Cat) eat() {
  11. fmt.Println("cat " + c.Name + " is eating fish")
  12. }
  13. func (d *Dog) eat() {
  14. fmt.Println("dog " + d.Name + " is eating bone")
  15. }
  16. // animal的本质是一个指针
  17. func showAnimal(animal Animal) {
  18. animal.eat()
  19. }
  20. func main() {
  21. var animal Animal // 接口的数据类型为“父类指针”
  22. animal = &Cat{"FuGui"}
  23. animal.eat()
  24. animal = &Dog{"WangCai"}
  25. animal.eat()
  26. cat := Cat{"FuGuiPig"}
  27. showAnimal(&cat)
  28. }