前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试官:为什么要面向接口编程?

面试官:为什么要面向接口编程?

作者头像
小锟哥哥
发布2022-12-05 14:10:25
4900
发布2022-12-05 14:10:25
举报
文章被收录于专栏:GoLang全栈

Go 语言和其他 Java 这类语言有一个非常不一样的地方,那就是接口这块。

Java 这些你需要在你的实现类上面声明下你实现了哪个接口,而 Go 不需要,只要你实现了接口里面的方法,就默认你实现了这个接口。

所以在某种程度上讲,Go 在面向接口编程这块他更加易用。

一、什么是接口?

我们需要先知道什么是面向接口编程,就要先搞懂啥是接口,这对于新手来说比较难理解,但是对于老鸟来说也未必能清晰表达出这个概念。

所有讲接口的文章总是喜欢拿 USB 说事,这其实很难理解的,反正我那时是一直没想明白,接口和 USB 有啥关系,虽然老师讲了一大堆,但是我依然没明白。

其实我们现实生活中到处都在用接口特点。

1、拿汽车举例子

就拿汽车举例,你会发现大部分同类汽车,他的很多设计都差不大多,比如都有油门,都有离合,都是圆形的方向盘等。

这么做的目的是为了啥呢?

为啥没有哪个汽车厂家,追求标新立异,把方向盘搞成方形的,或者把油门离合调换下位置?

这里面其实就用到了接口,那就是标准,这个标准有一点好处,那就是为了方便人们更容易使用汽车,不然你可能每买一辆汽车就要去考一辆车的驾照。

现在我们一步一步解析这里面的编程技术问题。

2、没接口的代码

直接上代码:

代码语言:javascript
复制
// WuLing 五菱
type WuLing struct{}

func (this *WuLing) Drive() {
 fmt.Println("驾驶五菱汽车")
}

// ChangAn 长安
type ChangAn struct{}

func (this *ChangAn) Drive() {
 fmt.Println("驾驶长安汽车")
}

这里有两辆车,一辆是五菱,一辆是长安。

他们都是汽车,所以都应该具有一个共同特点,那就是驾驶,也就是具有 Drive 方法给别人调用。

此时我们带入游戏代码场景中:假如一个玩家,他拥有很多辆车,我们不使用接口的情况下,是不是得这样去设计我们的代码:

代码语言:javascript
复制
// Person 一个人
type Person struct {
 Car1 *ChangAn
 Car2 *WuLing
}

func main() {
 // 创建一个人
 p := Person{
  Car1: new(ChangAn),
  Car2: new(WuLing),
 }

 p.Car1.Drive()
 p.Car2.Drive()
}

后续这玩家每新增一辆车都要去修改结构体,是不是不太符合我们的需求。

所以这里我们最好的处理方式就是使用接口,把汽车的特定属性 Drive 抽理出来。

没错现实生活中的某某标准,在代码里面其实就是接口。

  • 现实生活中达到某某标准,就说明他咋样咋样,能咋样咋样。
  • 代码的世界里面也是这样,实现某某接口,才可能被后续的某某使用。

二、面向接口编程

现在我们来制定下汽车的标准,也就是抽离下公共属性:

代码语言:javascript
复制
// ICar 汽车接口
type ICar interface {
 Drive()
}

这样就制定好了一个标准,只要具有驾驶属性的我们都认为他是汽车,当然你可以加更多的标准。

所以我们现在就能改造人类结构体了:

代码语言:javascript
复制
// Person 一个人
type Person struct {
 //Car1 *ChangAn
 //Car2 *WuLing
 
 // 拥有的汽车
 Cars []ICar
}

// DriveCar 驾驶车
func (this *Person) DriveCar(car ICar) {
 car.Drive()
}

现在我们就可以使用 Cars 一个属性承载所有的汽车了。使用就可以变成这样:

代码语言:javascript
复制
func main() {
 // 创建一个人
 p := Person{}
 p.Cars = append(p.Cars, &ChangAn{})
 p.Cars = append(p.Cars, &WuLing{})
 // 驾驶车
 p.DriveCar(p.Cars[0])
}

后续扩展、删除汽车都非常容易了。我们后续可以新增很多很多汽车道具,比如:比亚迪、红旗等。

三、好处

面向接口编程,有一个最大的特点就是能解耦,易扩展。

实际开发中,还有一个词语叫 可插拔 ,其实这就是接口最好的体现,为啥能做到可插拔,那就是只要符合接口标准的就能插上使用。

比如日志库,他既能配置输出到控制台,又能配置输出到文件,或者同时输出。

再或者你的数据库模块,假如你公司有两套底层数据库 MySQL 和 Oracle ,但是又希望随时可是切换两套数据库,那最好的办法就是制定接口。

你学废了么?

你学废了么?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GoLang全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、什么是接口?
    • 1、拿汽车举例子
      • 2、没接口的代码
      • 二、面向接口编程
      • 三、好处
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档