Go语言学习草稿(6) 接口

package mainimport "fmt"// 只要实现了speak方法, 就是speaker类型 type speaker interface { speak( /*可以写参数*/) /*可以写返回值*/ }type cat struct{}type dog struct{}// 使用值接收者实现方法 func (d dog) speak() { fmt.Println("汪汪汪") }// 使用指针接收者实现方法 // 此时speaker对象只能存结构体指针类型的变量 func (c *cat) speak() { fmt.Println("喵喵喵") } func speakTest() { var d1 speaker = dog{} d1.speak() var d2 speaker = &dog{} d2.speak() var s speaker = &cat{} s.speak() }// 结构体嵌套 type animal interface { movable runnable } type movable interface { move() }type runnable interface { run() }func (c *cat) move() { fmt.Println("猫咪正在移动") } func (c *cat) run() { fmt.Println("猫咪正在奔跑") }func nestedStructureTest() { var c animal = &cat{} c.move() c.run() }// 空接口 // 所有类型都实现了空接口, 所以所有对象都可以用空接口引用 // 空接口作为map的值, 使map可以添加任意类型的成员 func emptyInterfaceOfMap() { m1 := make(map[string]interface{}, 16) m1["name"] = "张三" m1["age"] = 9000 m1["married"] = true fmt.Println(m1) }// 空接口作为函数的参数 func PrintLn(i interface{}) { fmt.Println(i) }func PrintLnTest() { PrintLn(100) }// 类型断言 func typeAssertion(a interface{}) { // 断言a一定是string类型 str, ok := a.(string) if ok { fmt.Println(str) } else { fmt.Print("不是字符串哦, ") switch a.(type) { case int, int32, int64: fmt.Println("是一个整数") case float64, float32: fmt.Println("是一个浮点数") default: fmt.Println("是不认识的类型") } } }func typeAssertionTest() { typeAssertion("喵喵喵")// 输出 喵喵喵 typeAssertion(1)// 输出 不是字符串哦, 是一个整数 typeAssertion(1.2)// 输出 不是字符串哦, 是一个浮点数 typeAssertion(int16(0)) // 输出 不是字符串哦, 是不认识的类型 }

    推荐阅读