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

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

示例代码:

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,所以我们可以使用接口重构一下这段代码。

示例代码:

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 做准备。

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 的案例,介绍在实际项目开发中,接口为项目开发带来的好处。

推荐阅读:


目录
相关文章
|
5天前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
52 0
|
5天前
|
JSON Go 数据格式
golang学习7,glang的web的restful接口结构体传参
golang学习7,glang的web的restful接口结构体传参
|
5天前
|
JSON Go 数据格式
golang学习6,glang的web的restful接口传参
golang学习6,glang的web的restful接口传参
|
5天前
|
JSON Go 数据格式
golang学习5,glang的web的restful接口
golang学习5,glang的web的restful接口
|
5天前
|
Go
golang学习4,glang的web接口
golang学习4,glang的web接口
|
5天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
141 1
|
5天前
|
缓存 测试技术 持续交付
Golang深入浅出之-Go语言中的持续集成与持续部署(CI/CD)
【5月更文挑战第5天】本文介绍了Go语言项目中的CI/CD实践,包括持续集成与持续部署的基础知识,常见问题及解决策略。测试覆盖不足、版本不一致和构建时间过长是主要问题,可通过全面测试、统一依赖管理和利用缓存优化。文中还提供了使用GitHub Actions进行自动化测试和部署的示例,强调了持续优化CI/CD流程以适应项目需求的重要性。
55 1
|
5天前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
58 1
|
5天前
|
负载均衡 监控 Go
Golang深入浅出之-Go语言中的服务网格(Service Mesh)原理与应用
【5月更文挑战第5天】服务网格是处理服务间通信的基础设施层,常由数据平面(代理,如Envoy)和控制平面(管理配置)组成。本文讨论了服务发现、负载均衡和追踪等常见问题及其解决方案,并展示了使用Go语言实现Envoy sidecar配置的例子,强调Go语言在构建服务网格中的优势。服务网格能提升微服务的管理和可观测性,正确应对问题能构建更健壮的分布式系统。
30 1
|
5天前
|
消息中间件 Go API
Golang深入浅出之-Go语言中的微服务架构设计与实践
【5月更文挑战第4天】本文探讨了Go语言在微服务架构中的应用,强调了单一职责、标准化API、服务自治和容错设计等原则。同时,指出了过度拆分、服务通信复杂性、数据一致性和部署复杂性等常见问题,并提出了DDD拆分、使用成熟框架、事件驱动和配置管理与CI/CD的解决方案。文中还提供了使用Gin构建HTTP服务和gRPC进行服务间通信的示例。
29 0
http://www.vxiaotou.com