GO语言学习——接口一、接口的定义和实现
接口
接口(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)
}
本文来自博客园,作者:寻月隐君,转载请注明原文链接:https://www.cnblogs.com/QiaoPengjun/p/16460476.html

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号