接口 接口(interface) 接口是一种类型,是一种特殊的类型,它规定了变量有哪些方法 在编程中会遇到以下场景: 我不关心一个变量是什么类型,我只关心能调用它的什么方法 package mai
接口
接口(interface)
接口是一种类型,是一种特殊的类型,它规定了变量有哪些方法
在编程中会遇到以下场景:
我不关心一个变量是什么类型,我只关心能调用它的什么方法
package main
import "fmt"
// 引出接口的实例
// 定义一个能叫的类型
type speaker interface {
speak() // 只要实现了speak方法的变量都是speaker类型,方法签名
}
type cat struct{}
type dog struct{}
type person struct{}
func (c cat) speak() {
fmt.Println("喵喵喵~")
}
func (d dog) speak() {
fmt.Println("汪汪汪~")
}
func (p person) speak() {
fmt.Println("啊啊啊~")
}
func da(x speaker) {
// 接收一个参数传进来什么我就打什么
x.speak() // 挨打了就要叫
}
func main() {
var c1 cat
var d1 dog
var p1 person
da(c1)
da(d1)
da(p1)
var ss speaker // 定义一个接口类型:speaker 的变量: ss
ss = c1
ss = d1
ss = p1
fmt.Println(ss)
}
接口示例
package main
import "fmt"
// 接口示例2
// 不管是什么牌子的车,都能跑
// 定义一个car接口类型
// 不管是什么结构体,只要有run方法都能是car类型
type car interface {
run()
}
type falali struct {
brand string
}
func (f falali) run() {
fmt.Printf("%s最漂亮!\n", f.brand)
}
type baoshijie struct {
brand string
}
func (b baoshijie) run() {
fmt.Printf("%s最实用!\n", b.brand)
}
// drive函数接收一个car类型的变量
func drive(c car) {
c.run()
}
func main() {
var f1 = falali{
brand: "法拉利",
}
var b1 = baoshijie{
brand: "保时捷",
}
drive(f1)
drive(b1)
}
接口的定义
type 接口名 interface {
方法名1(参数1,参数2...)(返回值1,返回值2...)
方法名2(参数1,参数2...)(返回值1,返回值2...)
...
}
用来给变量\参数\返回值等设置类型
接口的实现
一个变量如果实现了接口中规定的所有的方法,那么这个变量就实现了这个接口,可以称为这个接口的变量
接口保存的分为两部分:值的类型和值本身
这样就实现了接口变量存储不同的值
动态类型 动态值
package main
import "fmt"
// 接口的实现
type animal interface {
move()
eat(string)
}
type cat struct {
name string
feet int8
}
func (c cat) move() {
fmt.Println("走猫步...")
}
func (c cat) eat(food string) {
fmt.Printf("猫吃%s...\n", food)
}
type chicken struct {
feet int8
}
func (c chicken) move() {
fmt.Println("鸡动了!")
}
func (c chicken) eat(food string) {
fmt.Println("吃%s...\n", food)
}
func main() {
var a1 animal // 定义一个接口类型的变量
fmt.Printf("%T\n", a1)
bc := cat{ // 定义一个cat类型的变量bc
name: "淘气",
feet: 4,
}
a1 = bc
a1.eat("小黄鱼")
fmt.Println(a1)
kfc := chicken{
feet: 2,
}
a1 = kfc
fmt.Printf("%T\n", a1) // main.chicken
a1.eat("虫子")
fmt.Println(a1)
}