0%

go interface

接口

  • 在Go语言中接口(interface)是一种类型,一种抽象的类型。
  • interface(接口)是golang最重要的特性之一,实现多态。Interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量
  • 本篇主要来源这里

接口定义和实现

接口定义

1
2
3
4
5
6
// hello_work\iinterface\studyInterface.go
/ 定义一个动物接口,接口中有个方法名称,但是不具体实现
type Animal interface {
Say()
GetName() string //返回内容为string
}

接口实现

  • 一个对象只要全部实现了接口中的方法,那么就实现了这个接口。换句话说,接口就是一个需要实现的方法列表。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

type Dog struct {
Name string
}

type Cat struct {
Name string
}

// 对应实现了接口中的方法
func (d Dog) Say() {
fmt.Println("汪汪汪")
}
// 对应实现了接口中的方法
func (d Dog) GetName() string {
return d.Name
}

func (c Cat) Say() {
fmt.Println("喵喵喵")
}
func (c Cat) GetName() string {
return c.Name
}

完整代码如下:

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
\\ hello_work/iinterface/studyInterface.go
package iinterface

import "fmt"

// 定义一个动物接口,接口中有个方法
type Animal interface {
Say()
GetName() string
}

// 如下开始,为实现接口中的方法

type Dog struct {
Name string
}

type Cat struct {
Name string
}

// 对应实现了接口中的方法
func (d Dog) Say() {
fmt.Println("汪汪汪")
}
func (d Dog) GetName() string {
return d.Name
}

func (c Cat) Say() {
fmt.Println("喵喵喵")
}
func (c Cat) GetName() string {
return c.Name
}

接口类型变量

  • 接口类型变量能够存储所有实现了该接口的实例
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
// hello_work\main.go
package main

import (
"fmt"

"example.com/hello_work/hello_work/iinterface"
)

func main() {
// 声明一个Animal类型的变量animal
var animal iinterface.Animal
// 实例化一个dog结构体
dog := iinterface.Dog{Name: "旺财"}
// 可以把dog实例直接赋值给变量animal
animal = dog
dogName := animal.GetName()
fmt.Println(dogName)
animal.Say()

cat := iinterface.Cat{Name: "工程喵"}
animal = cat
catName := animal.GetName()
fmt.Println(catName)
animal.Say()

}

  • 运行结果
1
2
3
4
5
PS E:\proj\gowork> go run .\hello_work\main.go
旺财
汪汪汪
工程喵
喵喵喵

注意,如果实现了接口中的方法(studyInterface.go)用的是指针,如func (d *Dog),那么对应实例化时也要传入指针,dog := &iinterface.Dog{Name: “旺财”}

空接口

  • 空接口是指没有定义任何方法的接口。因此任何类型都实现了空接口。

  • 空接口类型的变量可以存储任意类型的变量。

实例

  • 可以作为字符串,数字,bool类型等
1
2
3
4
5
6
7
8
9
10
11
12
13
func main() {
// 定义一个空接口x
var x interface{}
s := "pprof.cn"
x = s
fmt.Printf("type:%T value:%v\n", x, x)
i := 100
x = i
fmt.Printf("type:%T value:%v\n", x, x)
b := true
x = b
fmt.Printf("type:%T value:%v\n", x, x)
}
  • 空接口作为函数的参数
1
2
3
4
// 空接口作为函数参数
func show(a interface{}) {
fmt.Printf("type:%T value:%v\n", a, a)
}
  • 空接口作为map的值
1
2
3
4
5
6
// 空接口作为map值
var studentInfo = make(map[string]interface{})
studentInfo["name"] = "李白"
studentInfo["age"] = 18
studentInfo["married"] = false
fmt.Println(studentInfo)