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

package main

import "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)) // 输出 不是字符串哦, 是不认识的类型
}

你可能感兴趣的:(Go)