package main
import (
"fmt"
"math/rand"
"time"
)
type Animals interface {
Live()
Godie()
}
type Bird struct {
}
func (b *Bird) Live() {
fmt.Println("一只鸟儿在飞翔")
}
func (b *Bird) Godie() {
fmt.Println("一只鸟儿死翘翘")
}
type Fish struct {
}
func (f *Fish) Live() {
fmt.Println("一只鱼儿在游泳")
}
func (f *Fish) Godie() {
fmt.Println("一只鱼儿死翘翘")
}
type Beast struct {
}
func (b *Beast) Live() {
fmt.Println("一只野兽在打滚")
}
func (b *Beast) Godie() {
fmt.Println("一只野兽死翘翘")
}
func (b *Beast) Run() {
fmt.Println("一个野兽在奔跑")
}
func (b *Beast) Hunt() {
fmt.Println("一个野兽在捕食")
}
type tiger struct {
Beast
}
func (t *tiger) Live() {
fmt.Println("本王在巡视领地")
}
func (t *tiger) Godie() {
fmt.Println("大猫也有godie的一天")
}
func (t *tiger) Run() {
fmt.Println("本王在奔跑")
}
func (t *tiger) Hunt() {
fmt.Println("本王在捕食")
}
type human struct {
Beast
}
func (h *human) Live() {
fmt.Println("广东人在工作")
}
func (h *human) Godie() {
fmt.Println("人去世了")
}
func (h *human) Run() {
fmt.Println("广东人在跑步")
}
func (h *human) Hunt() {
fmt.Println("广东人在吃饭")
}
func main() {
bird := Bird{}
fish := Fish{}
beast := Beast{}
t := tiger{beast}
h := human{beast}
animals := make([]Animals, 0)
animals = append(animals, &bird, &fish, &beast, &t, &h)
r := rand.New(rand.NewSource(time.Now().UnixNano()))
rand := r.Intn(7)
fmt.Println(rand)
if rand > 0 && rand < 6 {
for _, animal := range animals {
animal.Live()
}
} else {
for _, animal := range animals {
//使用第一种类型断言
//switch animal.(type) {
//case *human:
// //父类转子类
// //animal使用human的方法
// animal.(*human).Hunt()
//case *Beast:
// //animal使用beast的方法
// animal.(*Beast).Run()
//default:
// animal.Godie()
//}
//第二种类型断言的方法
if human,ok := animal.(*human);ok {
human.Hunt()
}else if beast,ok:=animal.(*Beast);ok{
beast.Hunt()
}else {
animal.Godie()
}
}
}
}