接口的定义与实现

一个变量如果实现了接口规定的所有的方法,那么这个变量就实现了这个接口,可以称为这个接口类型的变量

把接口当作变量使用

type 接口名称 interface{
  方法函数名()
}
//var一个变量
var ss specker
变量名 = 参数
fmt.Println(变量名)

package main

import "fmt"

type dog struct{}

type person struct {
}
type cat struct{}

type specker interface {
  speck() //实习了speak方法的变量都是specker类型
}

func (d dog) speck() {
  fmt.Println("汪汪汪")
}

func (c cat) speck() {
  fmt.Println("喵喵喵")
}

func (p person) speck() {
  fmt.Println("呜呜呜")
}

func da(x specker) {
  //接受一个参数,传进来什么,我就打什么
  x.speck() //挨打了就要叫
}

func main() {
  p1 := person{}
  d1 := dog{}
  c1 := cat{}
  da(p1)
  da(d1)
  da(c1)
  // 此处定义了一个specker接口类型的变量ss
  var ss specker
  // ss复制p1
  ss = p1
  fmt.Println(ss)
}

go语言是面向接口类型的编程语言,对于接口后面是通过面向对象还是面向过程实现的无所谓,只要能实现方法即可,都统一通过接口进行调用

接口传参

例题

package main

import "fmt"

type animal interface {
  move()
  eat(string)
}

type cat struct {
  name string
  foot int8
}

type dog struct {
  name string
  foot int8
}

func (c cat) move() {
  fmt.Printf("%v在移动\n", c.name)
}

func (c cat) eat(e string) {
  fmt.Printf("%v在吃%v\n", c.name, e)
}

func (d dog) move() {
  fmt.Printf("%v在移动\n", d.name)
}

func (d dog) eat(e string) {
  fmt.Printf("%v在吃%v\n", d.name, e)
}

func main() {
  c1 := cat{
    name: "淘淘",
    foot: 4,
  }
  d1 := dog{
    name: "大黑",
    foot: 4,
  }
  var aa animal
  aa = c1
  fmt.Println(aa)
  // {淘淘 4}
  aa.eat("鱼")
  aa.move()
  aa = d1
  fmt.Println(aa)
  // {大黑 4}
  aa.eat("骨头")
  aa.move()
}

指针接受接口和值接受接口的区别

使用指针传递数据要使用指针接受

package main

import "fmt"

type animal interface {
  move()
  eat(string)
}

type cat struct {
  name string
  foot int8
}

type dog struct {
  name string
  foot int8
}

func (c *cat) move() {
  fmt.Printf("%v在移动\n", c.name)
}

func (c *cat) eat(e string) {
  fmt.Printf("%v在吃%v\n", c.name, e)
}

func (d *dog) move() {
  fmt.Printf("%v在移动\n", d.name)
}

func (d *dog) eat(e string) {
  fmt.Printf("%v在吃%v\n", d.name, e)
}

func main() {
  c1 := cat{
    name: "淘淘",
    foot: 4,
  }
  d1 := dog{
    name: "大黑",
    foot: 4,
  }
  var aa animal
  aa = &c1
  fmt.Println(aa)
  // {淘淘 4}
  aa.eat("鱼")
  aa.move()
  aa = &d1
  fmt.Println(aa)
  // {大黑 4}
  aa.eat("骨头")
  aa.move()
}

对象的方法使用指针接受值后面调动接口也要使用指针接受值

posted @ 2023-02-08 21:05  suknna  阅读(79)  评论(0)    收藏  举报