基本的要素

  • 基本的要素口有一个父类(有接口)
  • 有子类(实现了父类的全部接口方法)
  • 父类类型的变量(指针)指向(引用)子类的具体数据变量

    interface 实现多态

    代码

    ```go package main

import ( “io” “log” “os” )

// 动物接口 type Animal interface { Sleep() //动物都能做的 睡觉 GetColor() string //取得动物的颜色 GetType() string // 取得动物的种类 }

func ShowAnimal(v Animal) { v.Sleep() //多态方法, 不管是猫还是狗, 直接睡觉

  1. log.Println("动物种类=", v.GetType())
  2. log.Println("动物颜色=", v.GetColor())

}

// 猫 type Cat struct { color string // 猫的颜色

}

func (t *Cat) Sleep() { log.Println(“猫开始睡觉”) }

func (t *Cat) GetColor() string { return t.color }

func (t *Cat) GetType() string { return “家猫” }

// 狗 type Dog struct { color string // 狗的颜色

}

func (t *Dog) Sleep() { log.Println(“狗开始睡觉”) }

func (t *Dog) GetColor() string { return t.color }

func (t *Dog) GetType() string { return “野狗” }

func main() { log.SetOutput(io.MultiWriter(os.Stdout)) log.SetFlags(log.Lshortfile)

  1. cat := Cat{color: "白"}
  2. dog := Dog{color: "黄"}
  3. ShowAnimal(&cat)
  4. log.Println("----------")
  5. ShowAnimal(&dog)

}

  1. <a name="snAIz"></a>
  2. ### 输出
  3. ```go
  4. main.go:30: 猫开始睡觉
  5. main.go:19: 动物种类= 家猫
  6. main.go:20: 动物颜色= 白
  7. main.go:67: ----------
  8. main.go:48: 狗开始睡觉
  9. main.go:19: 动物种类= 野狗
  10. main.go:20: 动物颜色= 黄

interface 通用万能数据数据类型

  • 空接口
  • int``string``float32 float64``struct 都实现了 interface{}
  • 可以使用 interface{} 类型 引用 任意的数据类型

    代码

    ```go package main

import ( “io” “log” “os” )

type Book struct { title string }

// interface 万能数据类型 func myFunc(arg interface{}) { log.Println(arg)

  1. // interfacef{} 改如何区分 此时引用的底层数据类型到底是什么?
  2. // 给interfacef{}提供 "类型断言" 的机制
  3. v, ok := arg.(string)
  4. if ok {
  5. log.Println("arg 参数为字符串类型")
  6. log.Printf("字符串内容是=%v, 数据类型: %T\n", v, v)
  7. }
  8. log.Printf("实际数据类型: %T", arg)

}

func main() { log.SetOutput(io.MultiWriter(os.Stdout)) log.SetFlags(log.Lshortfile)

  1. book := Book{"golang"}
  2. myFunc(book)
  3. log.Println("--------------")
  4. myFunc("字符串")
  5. log.Println("--------------")
  6. myFunc(100)
  7. log.Println("--------------")
  8. myFunc(3.14)

}

  1. <a name="Cldsh"></a>
  2. ### 输出
  3. ```go
  4. main.go:15: {golang}
  5. main.go:25: 实际数据类型: main.Book
  6. main.go:35: --------------
  7. main.go:15: 字符串
  8. main.go:21: arg 参数为字符串类型
  9. main.go:22: 字符串内容是=字符串, 数据类型: string
  10. main.go:25: 实际数据类型: string
  11. main.go:37: --------------
  12. main.go:15: 100
  13. main.go:25: 实际数据类型: int
  14. main.go:39: --------------
  15. main.go:15: 3.14
  16. main.go:25: 实际数据类型: float64