【Golang】go语言之接口(interface)

接口interface

关于接口的概念

  • 接口interface是定义了一组方法的集合,

  • 接口提供了一种标准化的方式,用来规定对象的行为,。

  • 通过接口,你定义了对象必须具备的方法。而不必关心对象的具体实现。这种抽象的方式,可以更加灵活和复用

  • 通过定义接口interface,然后让对象来调用或者实现

  • 接口interface可以作为函数的入参参数,也可以作为返回值 实现多态

  • 接口Interface 是一种规范,是一种限制,

当你把接口interface定义好后,作为入参,那你这个函数的入参,就必须有你定义的接口interface有的方法,不然就会报错,

  • 同理你把interface类型的东西作为return出去的东西,那你就在定义return的对象时就必须定义他有哪些方法,

  • 总的说,接口等同于python的基类,基类用于子类必须实现方法,接口也是子类必须实现方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package main

import "fmt"

type animal interface { //在定义接口interface类型,这个类型有一个say方法
say()
}
type cat struct { // 结构体
Name string
}
type dog struct { // 结构体
Name string
}

func (c cat) say() { // 这个是方法,结构体的方法
fmt.Printf("%v小花猫,喵喵叫\n", c.Name)
}

// 这两个结构体都有say方法
func (d dog) say() { // 这个say也是方法,结构体的方法
fmt.Printf("%v小土狗,汪汪叫\n", d.Name)

}
func aaa(a animal) string { //这个方法的入参是一个animal接口类,所以传进来的参数必须要是animal类型,必须要有say方法
a.say()
return "aaa"
}
func bbb(s string) animal { // 这是在定义一个返回值为interface接口类型的函数
//a.say()
//a.say()
c := cat{"小白"}
return c
}

func main() {
c := cat{"小白"} //这个C是cat结构体的实例化对象
d := aaa(c) //这个d是函数aaa的实例化对象 需要传入参,入参就是C 且这个入参必须要有say方法,不然就会报错
fmt.Printf(d) //打印这个d,此时d是有返回值string的所以可以打印出来
e := bbb("hello") //这是在实例化bbb函数,e就是上面的c,是一个interface接口类型的。
e.say() // e是不可以直接打印的,因为你无法打印接口类型。但是你可以调用这个interface接口的方法

}

接口也是一种类型,可以定义变量

  • 结构体—结构体方法—接口
  • 接口类型的变量,能够储存所有实现了该接口的结构体。
  • 实例化一个变量(对象)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package main

import "fmt"

type animal interface {
say()
}

type cat struct {
Name string
}
type dog struct {
Name string
}

func (c cat) say() {
fmt.Printf("%v小猫喵喵叫\n", c.Name)
}
func (d dog) say() {
fmt.Printf("%v小狗汪汪叫\n", d.Name)
}
func main() {
var a animal
fmt.Printf("类型是:%T\n", a) //打印的类型是nil 类型
fmt.Printf("打印的内容是:%v\n", a) // 这个a 是一个接口类型的实例化对象,所以打印是没有数据的 打印的是nil
c := cat{"小花"}
a = c //这个时候把c赋值给了a,所以a有c的属性
fmt.Println(a) //所以打印的时候,就可以打印a了,
a.say()

}

定义指针类型和值类型接收器实现接口

  • 值类型接口实现后,不管是结构体还是结构体指针的变量,都可以赋值给接口变量
  • 只要是值接收器,修改的都是新的。
  • 使用指针接收器实现接口之后,只能将结构体指针变量赋值给该接口变量
  • 只要是指针接收器,修改的都是原来的。、

你在定义结构体方法的时候,将入参定义为指针类型入参即可,

这样你在实例化这个结构体的时候,传入指针类型即可


【Golang】go语言之接口(interface)
http://example.com/2023/12/06/804go语言之接口(interface)/
作者
Wangxiaowang
发布于
2023年12月6日
许可协议