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}
定义 Cat
、Dog
和 Human
三个结构体,分别实现各自的 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 中的接口设计非常出色,因为它解耦了接口和实现类之间的联系,使得进一步增加了我们编码的灵活度,解决了供需关系颠倒的问题。