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语言学习草稿(6) 接口
最新推荐文章于 2024-04-20 13:22:04 发布