不会飞的章鱼

熟能生巧,勤能补拙;念念不忘,必有回响。

对Go语言interface的理解

什么是interface

interface是一组method(方法)的组合,我们通过interface来定义对象的一组行为。

interface类型

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
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
type Human struct {
name string
age int
phone string
}

type Student struct {
Human //匿名字段Human
school string
loan float32
}

type Employee struct {
Human //匿名字段Human
company string
money float32
}

//Human对象实现Sayhi方法
func (h *Human) SayHi() {
fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
}

// Human对象实现Sing方法
func (h *Human) Sing(lyrics string) {
fmt.Println("La la, la la la, la la la la la...", lyrics)
}

//Human对象实现Guzzle方法
func (h *Human) Guzzle(beerStein string) {
fmt.Println("Guzzle Guzzle Guzzle...", beerStein)
}

// Employee重载Human的Sayhi方法
func (e *Employee) SayHi() {
fmt.Printf("Hi, I am %s, I work at %s. Call me on %s\n", e.name,
e.company, e.phone) //此句可以分成多行
}

//Student实现BorrowMoney方法
func (s *Student) BorrowMoney(amount float32) {
s.loan += amount // (again and again and...)
}

//Employee实现SpendSalary方法
func (e *Employee) SpendSalary(amount float32) {
e.money -= amount // More vodka please!!! Get me through the day!
}

// 定义interface
type Men interface {
SayHi()
Sing(lyrics string)
Guzzle(beerStein string)
}

type YoungChap interface {
SayHi()
Sing(song string)
BorrowMoney(amount float32)
}

type ElderlyGent interface {
SayHi()
Sing(song string)
SpendSalary(amount float32)
}

通过上面的代码我们可以知道

  • interface可以被任意对象调用和实现。
  • 一个对象可以实现任意多个interface。

形象的比喻:每个物种都是一个类,我们给这个类定义一系列的行为,例如给鸟类定义可以飞行的行为,给狗定义可以“汪汪”的声音,给人类定义可以说话可以跑步的行为,那么当你和我都实现了说话和跑步的行为,你我都属于人类,你和我都实现了飞行的行为,你我都属于鸟类,以此类推。这么做的意义在于,实现代码的高度使用。

思考:errors 这个 package 里面的 errors.New 到底是做什么的?

errors包实现了创建错误值的函数。

1
func New(text string) error

使用字符串创建一个错误,可以类比fmt包的Errorf方法,差不多可以认为是New(fmt.Sprintf(…))。

例子

1
2
3
4
5
6
7
8
9
10
func echo(request string) (response string, err error) {
if request == "" {
//调用errors.New函数时传入一个由字符串代表的错误信息,它会返回
//给我们一个包含了这个错误信息的error类型值。该值的静态类型是error
err = errors.New("empty content")
return
}
response = fmt.Sprintf("echo: %s", request)
return
}

其实就是返回一个自己定义的错误。

参考链接

gopkg-errors

New的实现

------ 本文结束------
如果本篇文章对你有帮助,可以给作者加个鸡腿~(*^__^*),感谢鼓励与支持!