接口介绍和快速入门|学习笔记

简介: 快速学习接口介绍和快速入门

开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:接口介绍和快速入门】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/626/detail/9697


接口介绍和快速入门

 

内容简介

一、基本介绍

二、接口快速入门

 

一、 基本介绍

1. 为什么要讲接口

面向对象编程里面的接口( interface ),看下图:

image.pngimage.png

这张图比较说明了现实生活中的接口,现实生活中我们有电脑,电脑里都有一个 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 随着传入的参数类型不同,它能体现出不同的状态,这个其实就是多态,现在只是还没有把此概念深入剖析,但是接口编程的大体结构已经出来了。

相关文章
|
Kubernetes Linux API
[没接触过kubevirt?]15分钟快速入门kubevirt
什么是kubevirt? kubevirt是一个容器方式运行虚拟机的项目。`kubevirt`是附加`kubernetes`集群上的,它是通过 `CustomResourceDefinition(CRD)`部署到`Kubernetes API`变成资源对象。使用方式类似创建`deploy、pod`......这些资源清单。
4463 0
[没接触过kubevirt?]15分钟快速入门kubevirt
|
6月前
|
存储 Python
PythonOOP快速入门
PythonOOP快速入门
|
7月前
|
算法 数据可视化 Java
Gephi快速入门
Gephi快速入门
|
7月前
|
存储 编译器 Linux
C++:快速入门篇
C++:快速入门篇
80 0
|
7月前
|
存储 算法 程序员
C++基础快速入门
C++基础快速入门
112 0
C++基础快速入门
|
Linux Windows
QMQTT快速入门
环境搭建 • 准备一台linux设备和一台windows设备虚拟机也是可以的; • 安装mosquitto ; • 准备QMQTT环境 - windows下;
175 0
|
SQL 负载均衡 NoSQL
DawnSql快速入门
DawnSql开源分布式数据库,快速入门
DawnSql快速入门
|
Java
19 接口快速入门
接口就是把给出的一些未实现的方法,封装到一起;某个类需要实现接口的时候再重写这些方法
95 0
|
SQL 分布式计算 关系型数据库
MLSQL(Byzer)的快速入门
MLSQL(Byzer)的快速入门
MLSQL(Byzer)的快速入门
|
自然语言处理 编译器 Linux
【C++】—— 快速入门(1)
【C++】—— 快速入门(1)
269 0
【C++】—— 快速入门(1)