Golang 基础 Part 8: Interface

文章讨论了 Golang 中 interface 的基础知识(包括 interface 的多态、类型断言)、怎样使用 interface 以及使用 interface 需要注意的地方。


1. interface 及其多态

interface 定义了一个或一组 method(s),若某个数据类型实现了 interface 中定义的那些被称为 "methods" 的函数,则称这些数据类型实现(implement)了 interface。举个例子来说明。

1//定义了一个Mammal的接口,当中声明了一个Say函数。
2type Mammal interface {
3 Say()
4}

定义 CatDogHuman 三个结构体,分别实现各自的 Say 方法:

 1type Dog struct{}
 2
 3type Cat struct{}
 4
 5type Human struct{}
 6
 7func (d Dog) Say() {
 8 fmt.Println("woof")
 9}
10
11func (c Cat) Say() {
12 fmt.Println("meow")
13}
14
15func (h Human) Say() {
16 fmt.Println("speak")
17}

之后,我们尝试使用这个接口来接收各种结构体的对象,然后调用它们的 Say 方法:

 1func main() {
 2 var m Mammal
 3 m = Dog{}
 4 m.Say()
 5 m = Cat{}
 6 m.Say()
 7 m = Human{}
 8 m.Say()
 9}
10// print result:
11// woof
12// meow
13// speak

2. 关于 interface 的类型断言

 1//类型断言
 2//一个判断传入参数类型的函数
 3func just(items ...interface{}) {
 4    for index, v := range items {
 5        switch v.(type) {
 6        case bool:
 7            fmt.Printf("%d params is bool,value is %v\n", index, v)
 8        case int, int64, int32:
 9            fmt.Printf("%d params is int,value is %v\n", index, v)
10        case float32, float64:
11            fmt.Printf("%d params is float,value is %v\n", index, v)
12        case string:
13            fmt.Printf("%d params is string,value is %v\n", index, v)
14        case Student:
15            fmt.Printf("%d params student,value is %v\n", index, v)
16        case *Student:
17            fmt.Printf("%d params *student,value is %v\n", index, v)
18
19        }
20    }
21}

3. 总结

今天我们一起聊了面向对象中多态以及接口、类型断言的概念和写法,借此进一步了解了为什么 golang 中的接口设计非常出色,因为它解耦了接口和实现类之间的联系,使得进一步增加了我们编码的灵活度,解决了供需关系颠倒的问题。

翻译: