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

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

[[437106]]

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

示例代码:

  1. type Cat struct { 
  2.  
  3.  
  4. func (c Cat) Say() string { 
  5.  return "miaow" 
  6.  
  7. type Dog struct { 
  8.  
  9.  
  10. func (d Dog) Say() string { 
  11.  return "woof woof" 
  12.  
  13. func TestSay(t *testing.T) { 
  14.  c := Cat{} 
  15.  t.Log("Cat say:", c.Say()) 
  16.  
  17.  d := Dog{} 
  18.  t.Log("Dog say:", d.Say()) 

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

示例代码:

  1. type Sayer interface { 
  2.  Say() string 
  3.  
  4. type Cat struct { 
  5.  
  6.  
  7. func (c Cat) Say() string { 
  8.  return "miaow" 
  9.  
  10. type Dog struct { 
  11.  
  12.  
  13. func (d Dog) Say() string { 
  14.  return "woof woof" 
  15.  
  16. type Horse struct { 
  17.  
  18.  
  19. func (h Horse) Say() string { 
  20.  return "neigh" 
  21.  
  22. func TestSay(t *testing.T) { 
  23.  c := Cat{} 
  24.  // t.Log("Cat say:", c.Say()) 
  25.  // 
  26.  d := Dog{} 
  27.  // t.Log("Dog say:", d.Say()) 
  28.  
  29.  h := Horse{} 
  30.  
  31.  animals := []Sayer{c, d, h} 
  32.  for _, a := range animals { 
  33.   t.Log("say:", a.Say()) 
  34.  } 

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

03接口编程案例

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

  1. type DBOrm interface { 
  2.  Insert(param ...interface{}) 
  3.  
  4. type XormDB struct { 
  5.  db *xorm.Session 
  6. func (x *XormDB) Insert(param ...interface{}) { 
  7.  _, err := x.db.Insert(param) 
  8.  if err != nil { 
  9.   log.Println(err) 
  10.  } 
  11.  
  12. // type GormDB struct { 
  13. //  db *gorm.DB 
  14. // } 
  15. //  
  16. // func (g *GormDB) Insert(param ...interface{}) { 
  17. //  g.db.Create(param) 
  18. // } 
  19.  
  20. type User struct { 
  21.  orm DBOrm 
  22.  Id int64 
  23.  Name string 
  24.  
  25. func (u *User) DB() DBOrm{ 
  26.  u.orm = new(XormDB) // 数据库实例注入接口 
  27.  // u.orm = new(GormDB) 
  28.  return u.orm 
  29.  
  30. func TestOrm(t *testing.T) { 
  31.  user1 := new(User
  32.  user1.Name = "lucy" 
  33.  user1.DB().Insert(user1) 

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

04总结

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

 

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

 

责任编辑:武晓燕 来源: Golang语言开发栈
相关推荐

2013-09-23 14:54:54

编程语言开发

2021-07-21 08:00:00

Kubernetes分布式存储集群

2011-12-23 15:20:46

专利

2022-01-06 22:10:38

Java容器微服务

2017-08-24 09:06:37

无代理备份好处

2020-06-30 10:30:24

编程语言开发大数据

2009-02-27 13:45:00

服务器合租合租服务器的好处

2022-09-22 15:01:13

智能建筑物联网

2023-02-03 15:48:20

数据中心云计算安全

2023-11-05 12:20:10

匿名函数Golang

2021-05-28 05:34:06

Golang语言编程

2021-04-27 16:44:54

物联网工业物联网数据

2021-01-05 10:17:38

人脸识别AI人工智能

2021-09-13 05:02:49

GogRPC语言

2021-12-02 10:16:10

机器人编程语言计算机语言

2021-02-21 13:48:13

Java编程语言

2010-06-13 16:09:28

MySQL maste

2011-05-26 16:52:33

2019-07-29 16:05:26

物联网数据科技

2020-08-07 17:41:37

主流固态硬盘
点赞
收藏

51CTO技术栈公众号