package main
import "fmt"
type Cat struct {
    Name string
}
func (c Cat) Say() string {return c.Name + ":喵喵喵"}
type Dog struct {
    Name string
}
func (d Dog) Say() string {return d.Name + ":汪汪汪"}
func main() {
	c := Cat{Name: "小白猫"}    // 小白猫:喵喵喵
	fmt.Println(c.Say())
	d := Dog{"阿黄"}
	fmt.Println(d.Say())       // 阿黄: 汪汪汪
}
/*
小白猫:喵喵喵
阿黄: 汪汪汪
 */ 
package main
import "fmt"
//1、接口是一个规范
type Usber interface {
    start()
    stop()
}
//2、如果接口里面有方法的话,必要要通过结构体或者通过自定义类型实现这个接口
func (p Phone) start() {
	fmt.Println(p.Name, "启动")
}
func (p Phone) stop() {
	fmt.Println(p.Name, "关机")
}
func main() {
	p := Phone{
		Name: "华为手机",
	}
	var p1 Usber   // golang中接口就是一个数据类型
	p1 = p       // 表示手机实现Usb接口
	p1.start()
	p1.stop()
}
/*
华为手机 启动
华为手机 关机
 */ 
package main
import "fmt"
//空接口作为函数的参数
func show(a interface{}){
    fmt.Printf("值:%v 类型:%T\n",a,a)
}
func main() {
	show(20)                      // 值:20 类型:int
	show("你好golang")            // 值:你好golang 类型:string
	slice := []int{1, 2, 34, 4}
	show(slice)                     // 值:[1 2 34 4] 类型:[]int
} 
pakcage main
import "fmt"
func main() {
    var slice = []interface{}{"Snail", 20, true, 32.2}
	fmt.Println(slice)  // [Snail 20 true 32.2]
} 
package main
import "fmt"
func main() {
    //空接口作为 map 值
    var studentInfo = make(map[string]interface{})
	studentInfo["name"] = "Snail"
	studentInfo["age"] = 18
	studentInfo["married"] = false
	fmt.Println(studentInfo)
	// [age:18 married:false name: Snail]
} 
package main
import "fmt"
func main() {
    var x interface{}
    x = "Hello GoLang"
    v,ok := x.(string)
    if ok {
        fmt.PrintIn(v)
    }else {
        fmt.PrintIn("非字符串类型")
    }
} 
package main
import "fmt"
type Usb interface {
    Start()
    Stop()
}
type Phone struct{
    Name string
}
func (p Phone) Start(){
    fmt.PrintIn(p.Name,"开始工作")
}
func (p Phone) Stop(){
    fmt.PrintIn(p.Name,"停止")
}
func main() {
    phone1 := Phone{    //1、实例化值类型
        Name:"小米手机"
    }
    var p1 Usb = phone1    //phone1实现了Usb接口phone1是Phone类型
    p1.Start()
	phone2 := &Phone{	     // 二:实例化指针类型
		Name: "苹果手机",
	}
	var p2 Usb = phone2      //phone2 实现了 Usb 接口 pho
} 
package main
import "fmt"
type Usb interface {
	Start()
	Stop()
}
type Phone struct {
	Name string
}
func (p *Phone) Start() {
	fmt.Println(p.Name, "开始工作")
}
func (p *Phone) Stop() {
	fmt.Println("phone 停止")
}
func main() {
	/*错误写法
	phone1 := Phone{
		Name: "小米手机",
	}
	var p1 Usb = phone1
	p1.Start()
	*/
	//正确写法
	phone2 := &Phone{     // 指针类型接收者只能传入指针类型,不能传入值类型
		Name: "苹果手机",
	}
	var p2 Usb = phone2 //phone2 实现了 Usb 接口 phone2 是 *Phone 类型
	p2.Start()
	//苹果手机 开始工作
}
 
package main
import "fmt"
type AInterface interface {
	GetInfo() string
}
type BInterface interface {
	SetInfo(string, int)
}
type People struct {
	Name string
	Age int
}
func (p People) GetInfo() string {
	return fmt.Sprintf("姓名:%v 年龄:%d", p.Name, p.Age)
}
func (p *People) SetInfo(name string, age int) {
	p.Name = name
	p.Age = age
}
func main() {
	var people = &People{
		Name: "Snail",
		Age: 20,
	}
	// people 实现了 AInterface 和 BInterface
	var p1 AInterface = people
	var p2 BInterface = people
	fmt.Println(p1.GetInfo())
	p2.SetInfo("pupu", 21)         // 姓名:Snail 年龄:20
	fmt.Println(p1.GetInfo())      // 姓名:pupu 年龄:21
}
 
package main
import "fmt"
type SayInterface interface {
	say()
}
type MoveInterface interface {
	move()
}
// 接口嵌套
type Animal interface {
	SayInterface
	MoveInterface
}
type Cat struct {
	name string
}
func (c Cat) say() {
	fmt.Println("喵喵喵")
}
func (c Cat) move() {
	fmt.Println("猫会动")
}
func main() {
	var x Animal
	x = Cat{name: "花花"}
	x.move()    // 猫会动
	x.say()     // 喵喵喵
}