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)
}

Original: https://www.cnblogs.com/QiaoPengjun/p/16460476.html
Author: QIAOPENGJUN
Title: GO语言学习——接口一、接口的定义和实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/596772/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球