package main

import "fmt"

type Usb interface {
	Start()
	Stop()
}

//手机
type Phone struct {
	Name string
}

//相机
type Camera struct {
	Name string
}

//计算机
type Computer struct {
}

//手机实现USB接口方法
func (p Phone) Start() {
	fmt.Println("手机开始工作...")
}
func (p Phone) Stop() {
	fmt.Println("手机停止工作...")
}
func (p Phone) Call() { //该方法未定义
	fmt.Println("我是手机,我要打电话...")
}

//相机实现USB接口方法
func (c Camera) Start() {
	fmt.Println("相机开始工作...")
}
func (c Camera) Stop() {
	fmt.Println("相机停止工作...")
}

//编写一个方法Working,接收一个USB接口类型变量
//实现了USB接口的所有方法
func (c Computer) Working(usb Usb) {
	//通过usb接口变量调用start和stop方法
	usb.Start()
	//如果USB是指向Phone结构体变量,还需要调用Call方法
	phone, ok := usb.(Phone)
	if ok {
		phone.Call()
	}
	usb.Stop()

}

func main() {

	var usbArr [3]Usb
	usbArr[0] = Phone{}
	usbArr[1] = Camera{}
	usbArr[2] = Phone{}

	//Phone还有一个特有的方法call(),请遍历Usb数组,如果是Phone变量,
	//除了调用Usb接口声明的方法外,还需要调用Phone特有方法Call(类型断言)
	var computer Computer
	for _, v := range usbArr {
		computer.Working(v)
	}
}