Go语言中的接口

接口

Interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量。

如果一个变量实现了String()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出。(对比java中的重写toString()方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
type student struct {
name string
age int
}

func (s student) String() string {
str := fmt.Sprintf("name:[%s],age:[%d]\n", s.name, s.age)
return str
}

func main() {
var s student = student{
name: "张三",
age: 18,
}
fmt.Println(s)
}

接口实现

Golang中的接口,不需要显示的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口。因此,golang中没有implement类似的关键字
如果一个变量含有了多个interface类型的方法,那么这个变量就实现了多个接口。
如果一个变量只含有了1个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
33
34
35
36
37
type Person interface {
eat()
sleep()
run()
}

// Student实现了Person接口中的所有方法即Student实现了Person接口
type Student struct {
Name string
Age int
}

func (s Student) eat() {
fmt.Printf("%s eat!\n", s.Name)
}

func (s Student) sleep() {
fmt.Printf("%s sleep!\n", s.Name)
}

func (s Student) run() {
fmt.Printf("%s run!\n", s.Name)
}

func main() {
var s Student = Student{
Name: "张三",
Age: 18,
}
s.eat()
s.sleep()
s.run()
}
-----------------------
张三 eat!
张三 sleep!
张三 run!

接口嵌套

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
44
45
46
47
48
49
50
51
52
53
type Person interface {
eat()
sleep()
run()
}
type Students interface {
Person
learn()
exam()
}

type Student struct {
Name string
Age int
}

func (s Student) eat() {
fmt.Printf("%s 吃饭!\n", s.Name)
}

func (s Student) sleep() {
fmt.Printf("%s 睡觉!\n", s.Name)
}

func (s Student) run() {
fmt.Printf("%s 运动!\n", s.Name)
}

func (s Student) learn() {
fmt.Printf("%s 学习!\n", s.Name)
}

func (s Student) exam() {
fmt.Printf("%s 考试!\n", s.Name)
}

func main() {
var s Student = Student{
Name: "张三",
Age: 18,
}
s.eat()
s.sleep()
s.run()
s.learn()
s.exam()
}
----------------
张三 吃饭!
张三 睡觉!
张三 运动!
张三 学习!
张三 考试!

多态

一种事物的多种形态,都可以按照统一的接口进行操作

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
type Persons interface {
eat()
sleep()
run()
}
type Students interface {
Persons
learn()
exam()
}

type Person struct {
Name string
Age int
}

type Student struct {
Name string
Age int
}

func (s Student) eat() {
fmt.Printf("%s 吃饭!\n", s.Name)
}

func (s Student) sleep() {
fmt.Printf("%s 睡觉!\n", s.Name)
}

func (s Student) run() {
fmt.Printf("%s 运动!\n", s.Name)
}

func (s Student) learn() {
fmt.Printf("%s 学习!\n", s.Name)
}

func (s Student) exam() {
fmt.Printf("%s 考试!\n", s.Name)
}

func (p Person) eat() {
fmt.Printf("%s 吃饭!\n", p.Name)
}

func (p Person) sleep() {
fmt.Printf("%s 睡觉!\n", p.Name)
}

func (p Person) run() {
fmt.Printf("%s 运动!\n", p.Name)
}

func main() {
var ps Persons
var s Student = Student{
Name: "张三",
Age: 18,
}
var p Person = Person{
Name: "李四",
Age: 18,
}
// 这里接口Persons可以是Person 也可以是Student
ps = s
ps.eat()
ps.run()
ps.sleep()

ps = p
ps.eat()
ps.run()
ps.sleep()

}
--------------------
张三 吃饭!
张三 运动!
张三 睡觉!
李四 吃饭!
李四 运动!
李四 睡觉!