前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang 语言编程使用接口有哪些好处?

Golang 语言编程使用接口有哪些好处?

作者头像
frank.
发布2021-11-30 09:26:03
1.8K0
发布2021-11-30 09:26:03
举报
文章被收录于专栏:Golang语言开发栈

01 介绍

在 Golang 语言中,接口类型定义了一组方法签名,接口类型的值可以保存实现了这些方法的任何值。

Golang 语言的接口是隐式实现的,它不像其他某些编程语言,使用 implements 关键字显式实现接口,Golang 语言没有 implements 关键字,一个类型只要实现接口定义的所有方法,就等于实现了该接口,所以也称为 Duck typing

if something looks like a duck, swims like a duck and quacks like a duck then it’s probably a duck.

关于 Golang 语言接口的使用,我们已经在前面的文章中介绍过,感兴趣的读者朋友可以翻阅一下。本文我们介绍一下使用接口有哪些好处?

02 使用接口的好处

在 Golang 语言中,我们使用结构体和方法可以很完美的实现需求。为什么还要使用接口呢?实际上,接口是一个工具,是否选择使用接口,取决于我们自己,它可以使我们的代码更优雅,更简洁,更具可读性。下面我们通过一个简单示例来说明接口的这些好处。

示例代码:

代码语言:javascript
复制
type Cat struct {

}

func (c Cat) Say() string {
 return "miaow"
}

type Dog struct {

}

func (d Dog) Say() string {
 return "woof woof"
}

func TestSay(t *testing.T) {
 c := Cat{}
 t.Log("Cat say:", c.Say())

 d := Dog{}
 t.Log("Dog say:", d.Say())
}

阅读上面这段代码,我们定义了两个结构体 Cat 和 Dog,并分别为其实现了 Say 方法。读者朋友们是否感觉到代码有些重复,因为 Cat 和 Dog 都有相同的签名的方法 Say,所以我们可以使用接口重构一下这段代码。

示例代码:

代码语言:javascript
复制
type Sayer interface {
 Say() string
}

type Cat struct {

}

func (c Cat) Say() string {
 return "miaow"
}

type Dog struct {

}

func (d Dog) Say() string {
 return "woof woof"
}

type Horse struct {

}

func (h Horse) Say() string {
 return "neigh"
}

func TestSay(t *testing.T) {
 c := Cat{}
 // t.Log("Cat say:", c.Say())
 //
 d := Dog{}
 // t.Log("Dog say:", d.Say())

 h := Horse{}

 animals := []Sayer{c, d, h}
 for _, a := range animals {
  t.Log("say:", a.Say())
 }
}

阅读上面这段代码,我们定义了一个接口 Sayer,该接口只有一个方法签名 Say。并且我们又新定义了一个结构体 Horse,和未使用接口的代码不同的是,我们不需要使用 h.Say() 调用 Horse 结构体的 Say 方法。

03 接口编程案例

在 Golang 语言项目开发中,为了更加方便操作 MySQL,我们通常会选择开源 ORM,但是社区有很多 ORM,可能在项目后期会遇到更换 ORM 的需求,我们可以使用接口使 ORM 尽量少的侵入业务代码,为以后替换 ORM 做准备。

代码语言:javascript
复制
type DBOrm interface {
 Insert(param ...interface{})
}

type XormDB struct {
 db *xorm.Session
}
func (x *XormDB) Insert(param ...interface{}) {
 _, err := x.db.Insert(param)
 if err != nil {
  log.Println(err)
 }
}

// type GormDB struct {
//  db *gorm.DB
// }
// 
// func (g *GormDB) Insert(param ...interface{}) {
//  g.db.Create(param)
// }

type User struct {
 orm DBOrm
 Id int64
 Name string
}

func (u *User) DB() DBOrm{
 u.orm = new(XormDB) // 数据库实例注入接口
 // u.orm = new(GormDB)
 return u.orm
}

func TestOrm(t *testing.T) {
 user1 := new(User)
 user1.Name = "lucy"
 user1.DB().Insert(user1)
}

阅读上面这段代码,我们创建了一个接口 DBOrm,创建了两个 ORM 结构体,并分别实现了接口 DBOrm 的签名方法,在业务结构体 User 中,包含的不是某个 ORM 结构体,而是 DBOrm 接口。

04 总结

本文我们主要介绍在 Golang 语言项目开发中,为什么使用接口,以及使用接口的好处,并通过示例代码证明接口带来的好处。

最后,通过使用接口调用 ORM 的案例,介绍在实际项目开发中,接口为项目开发带来的好处。

参考资料: https://en.wikipedia.org/wiki/Duck_typing https://stackoverflow.com/questions/39092925/why-are-interfaces-needed-in-golang

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

本文分享自 Go语言开发栈 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档