开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:接口介绍和快速入门】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9697
接口介绍和快速入门
内容简介
一、基本介绍
二、接口快速入门
一、 基本介绍
1. 为什么要讲接口
面向对象编程里面的接口( interface ),看下图:
这张图比较说明了现实生活中的接口,现实生活中我们有电脑,电脑里都有一个 USB 接口,假设现在有手机和相机,当把手机和相机插入到接口时,计算机会先识别是什么设备,然后再开始工作,现实生活中,就有接口的案例,对于手机和相机来说,它们并不关心它自己是什么,它只要把自己通过 USB 线插入到接口里,随后计算机就能识别它,便能为它工作了,这便是生活中的接口。 USB 插槽就是现实中的接口,可以把手机、相机、 U 盘都插在 USB 插槽上,而不用担心那个插槽是专门插哪个的,对于接口来说并不关心插入的是手机还是相机,只要插上了就能够识别,所以说接口有自动识别的功能。原因是做 USB 插槽的厂家和做各种设备的厂家都遵守了统一的规定包括尺寸、排线等等,这就好比上图中计算机对外的一个接口,当一个外设接入到 USB 接口过后,计算机内部就能识别插入的是什么外设,从而来进行服务,同样的道理,相机插入到 USB 接口,就能识别是相机。现实生活中这种接口是很有意义的,也是非常有意识的一种东西,一个接口就能搞定所有设备,这种现实生活中的实现方式在计算机编程里有。
2. 为什么先讲接口
在讲接口之前按理应当先讲多态,因为前面章节讲了封装和继承,这两大特性讲完了,现在应该是讲多态,需要先讲解接口( interface ),是因为在 Golang 中多态特性主要是通过接口来体现的,如果离开了接口,多态的特性是讲不明白的,所以需先讲接口再讲多态。
二、 接口快速入门
1. 接口快速入门需知
这种设计需求在 Golang 编程中也是会大量存在的,如果说 Golang的面向对象编程的核心是什么?那一定是接口编程,且 Golang 的接口语言编程和其他语言的编程不大一样,它非常的有特色,我曾经说过,一个程序就是一个世界,在现实生活中存在的情况,在程序中也会出现。我们用程序来模拟一下前面的应用场景。
2. 代码实现
首先新建一个文件夹称为 interfacedemo ,再建一个文件称为main.go ,并输入以下代码:
package main
import (
“fmt”
)
//声明/定义一个接口
type Usb interface {
//声明了两个没有实现的方法
Start( )
Stop( )
}
//将接口称为 Usb 接口,这是根据上图的接口,它的类型是interface ,在 Usb 里面简单的模拟一下,当一个外设插入时就开始工作,拔出来时就停止工作,其中 Start 和 Stop 是接口的两个方法。在文档里接口也是非常多的,点开 sort 文件,随便找一个便是接口,如下:
type Interface interface {
// Len 方法返回集合中的元素个数
Len( ) int
// Less 方法报告索引的元素是否比索引的元素小
Less(i,j int) bool
// Swap 方法交换索引 i 和 j 的两个元素
Swap(i,j int)
}
其中 interface 是接口的名称,Len、 Less 和 Swap 是接口的方法,这个接口有返回值 int 。(对上段代码的注释)
type Phone struct {
}
//让 Phone 实现 Usb 接口的方法
func (p Phone) Start( ) {
fmt.Println(“手机开始工作。。。”)
}
func (p Phone) Stop( ) {
fmt.Println(“手机停止工作。。。”)
}
// Phone 实现了 Usb 接口的两种方法,这时的结构体 Phone 其实就可以当作接口来使用,就可以给接口赋值了。(对上段代码的注释)
type Camera struct {
}
//让 Camera 实现 Usb 接口的方法
func (c Camera) Start( ) {
fmt.Println(“相机开始工作。。。”)
}
func (c Camera) Stop( ) {
fmt.Println(“相机停止工作。。。”)
}
// Camera 也实现了接口的两个方法” Start ”和” Stop ”。(对上段代码的注释)
//计算机
type Computer struct {
}
//此 Computer 是结构体,不需要属性。(对上段代码的注释)
//编写一个 Working 方法,接收一个 Usb 接口类型变量(用 Working 是因为接口一插入就工作)
//只要是实现了 Usb 接口(所谓实现 Usb 接口,就是指实现了 Usb接口声明所有方法,即 Phone 和 Camera 已经把接口里的 Start 和Stop 方法都实现了,总的来说 Phone 和 Camera 实现了接口,用了Usb 接口)
func (c Computer) Working(usb Usb) { //()中要接收一个东西,类型是 Usb ,说明此 Working 可以接收一个接口类型,就是 Usb接口类型
//通过 usb 接口变量来调节 Start 和 Stop 方法
usb.Start( )
usb.Stop( )
}
func main( ) {
//测试
//先创建结构体变量
computer := Computer{}
phone := Phone{}
//camera := Camera{}
//关键点
computer.Working(phone)
//computer.Working(camera)
}
//因为 Computer 里是有方法的,且 Phone 已经实现了接口,所以说调用它,即把 Phone 传给了接口,接口再去调用 Start 和 Stop,至于 Start 和 Stop 如何实现需根据如何写。(对以上关键点代码的注释)
//先测试 Phone ,把结构体变量 Phone 传给 Usb , Usb 调用 Start 和 Stop 方法,这时由于传的是 Phone ,所以会调用 Phone的 Start 和 Stop 。
执行结果为:
D:\goproject\src\go_code\chapter11\extendsdetails2>cd ..
D:\goproject\src\go_code\chapter11>cd interfacedemo
D:\goproject\src\go_code\chapter11\interfacedemo>go run main.go
手机开始工作。。。
手机停止工作。。。
//执行结果调用了 Phone 的方法,因为调的是 Phone 。(对以上执行结果的注释)
//接下来调用 Camera 的方法,当把 Camera 传进去它会自动识别,就会去调用 Camera 方法,和日常生活中一样,相机插进计算机,计算机识别的是相机;手机插入计算机,计算机识别的是手机。调用Camera 方法只需要将测试和关键点修改为:
//测试
//先创建结构体变量
computer := Computer{}
phone := Phone{}
camera := Camera{}
//关键点
computer.Working(phone)
computer.Working(camera)
}
执行结果为:
D:\goproject\src\go_code\chapter11\interfacedemo>go run main.go
手机开始工作。。。
手机停止工作。。。
相机开始工作。。。
相机停止工作。。。
3. 案例分析
通过案例知道:通过接口来做只需定义规范,即当去定义一个接口时,把接口都定好随后再让其他结构体或变量去实现它,然后就可以工作了,很方便,这种应用场景叫松耦合高列举的一种辨认思想,现在只是入门,后期会逐个深入讨论。
4. 案例说明
说明:上面的代码就是一个接口编程的快速入门案例,虽然很简单,但是它已经把接口编程的核心思想体现出来了,而且 func (c Computer) Working(usb Usb) {中的”usb Usb” 已经看到多态的影子了,为什么会这么说:当给它传了一个 Phone ,它就知道是 Phone ,当给它传了一个 Camera ,它就知道是 Camera ,难道不是多态吗?总的来说 Usb 随着传入的参数类型不同,它能体现出不同的状态,这个其实就是多态,现在只是还没有把此概念深入剖析,但是接口编程的大体结构已经出来了。