Go Web编程实战(5)----面向对象编程(二)

简介: Go Web编程实战(5)----面向对象编程(二)

接口


使用了接口实现了多态与继承,我们也应该详细了解接口的使用方式。


接口(interface)类型是对其他类型行为的概括与抽象。接口定义了一组方法,但是不包含这些方法的具体实现。


本质上接口依旧是一个类型,确切的说,是指针类型。如果一个类型实现了某个接口,则所有使用这个接口的地方都支持这种类型的值。


需要注意的是,如果实现接口的类型支持相等运算,那么可以比较,否则会报错。示例如下:

func main() {
  var var1,var2 interface{}
  fmt.Println(var1==nil,var2==nil)
  var1,var2=6,8
  fmt.Println(var1==var2)
  var1,var2=map[string]string{},map[string]string{}
  fmt.Println(var1==var2)
}


运行之后,大家会发现,空接口变量默认值是nil。也就是第一个输出肯定是两个true。而数值不相等,第二个输出false。第三个因为map类型不支持相等运算,所以报错。



接口的赋值

Go语言的接口不支持直接实例化,但支持赋值操作,从而快速实现接口与实现类的映射。


接口赋值在Go语言中分为如下两种情况:


将实现接口的对象实例赋值给接口

将一个接口赋值给另一个接口。


将实现接口的对象实例赋值给接口

将指定类型的对象实例赋值给接口,要求该对象对应的类实现了接口要求的所有方法,否则就不能算实现了该接口。

type Number int
func (x Number) Equal(i Number) bool {
  return x == i
}
func (x Number) LessThan(i Number) bool {
  return x < i
}
func (x Number) MoreThan(i Number) bool {
  return x > i
}
func (x *Number) Multiple(i Number) {
  *x = *x * i
}
func (x *Number) Divide(i Number) {
  *x = *x / i
}
type NumberI interface {
  Equal(i Number) bool
  LessThan(i Number) bool
  MoreThan(i Number) bool
  Multiple(x Number)
  Divide(x Number)
}
func main() {
  var x Number = 8
  var y NumberI = &x
  fmt.Println(x)
  fmt.Println(y)
}


这里,我们先定义了一个Number类型以及相关方法。按照Go语言的约定,Number类型实现了NumberI接口,接下来就可以将Num类型对应的对象实例赋值给Number接口。


为什么要将&x的指针赋值给接口变量呢?这是因为Go语言会根据下面这样的非指针成员方法:

func (x Number) Equal(i Number) bool

自动生成一个新的与之对应的指针成员方法:

func (x *Number) Equal(i Number) bool{
  return (*x).Equal(i)
}


这样一来,类型*Number就存在所有NumberI接口中声明的方法了。


将接口赋值给接口

在Go语言中,只要两个接口拥有相同的方法列表,则它们就是等同的,可以互相赋值。这里,我们直接将前面的三角形修改一下。

type Triangle struct {
  Bottom float32
  Height float32
}
type Area1 interface {
  Area(x,y float32) float32
}
type Area2 interface {
  Area(x,y float32) float32
}
func (a Triangle) Area(x,y float32) float32 {
  return x*y
}
func main() {
  f1 :=Triangle{2,3}
  var f2 Area1=f1
  var f3 Area2=f2
  fmt.Println(f3)
}


如果接口Area1的方法列表是接口Area2 的方法列表的子集,则接口Area2可以赋值给接口Area1 。修改为:

type Area2 interface {
  Area(x, y float32) float32
  Sum(x, y float32) float32
}
func (a Triangle) Sum(x, y float32) float32 {
  return x + y
}
func main() {
  f1 := Triangle{2, 3}
  var f2 Area2 = f1
  var f3 Area1 = f2
  fmt.Println(f3)
}


接口查询

接口查询是在程序运行时进行的,查询是否成功,也要在运行时才能够确定。示例如下:

//语法
if filew,ok:=fileWriter.(*File);ok{
  //...
}
//示例
func main() {
  slice := make([]int, 0)
  slice = append(slice, 6, 7, 8)
  var I interface{} = slice
  if res, ok := I.([]int); ok {
  fmt.Println(res)
  fmt.Println(ok)
  }
}


上面代码中的if语句会判断接口I所指向的对象是否是[]int类型,如果是,则输出切片中的元素。


通过使用”接口类型.(type)“形式,加上switch-case语句,可以判断接口存储的类型。示例如下:

func Len(array interface{}) int {
  var length int
  if array == nil {
  length = 0
  }
  switch array.(type) {
  case []int:
  length = len(array.([]int))
  case []string:
  length = len(array.([]string))
  case []float32:
  length = len(array.([]float32))
  default:
  length = 0
  }
  fmt.Println(length)
  return length
}
func main() {
  slice := make([]int, 0)
  slice = append(slice, 6, 7, 8)
  var I interface{} = slice
  Len(I)
}


接口的组合

在Go语言中,不仅结构体与结构体之间可以嵌套,接口与接口之间也可以嵌套创造出新的接口。一个接口可以包含一个或多个其他的接口,这相当于直接将这些内嵌接口的方法列举在外层接口中一样。


如果接口的所有方法被实现,则这个接口中的所有嵌套接口的方法均可以被调用。接口的组合很简单,直接将接口名写入接口内部即可。另外,还可以在接口内部再定义自己的接口方法。示例如下:

type interface1 interface {
  PrintlnStr(s string)(a string)
}
type interface2 interface {
  PrintlnInt(s int)(a int)
}
type interface3 interface {
  interface1
  interface2
}


相关文章
|
3月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
3月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
4月前
|
设计模式 缓存 算法
Go如何进行高质量编程与性能调优实践
本文介绍了Go语言高质量编程与性能调优的实践方法。高质量编程包括良好的编码习惯(如清晰注释、命名规范)、代码风格与设计(如MVC模式)、简洁明了的代码原则,以及单元测试与代码重构的重要性。性能调优方面,涵盖算法优化、数据结构选择、I/O优化、内存管理、并行与并发处理优化及代码层面的改进。通过这些方法,可有效提升代码质量和系统性能。
94 13
|
4月前
|
分布式计算 Go C++
初探Go语言RPC编程手法
总的来说,Go语言的RPC编程是一种强大的工具,让分布式计算变得简单如同本地计算。如果你还没有试过,不妨挑战一下这个新的编程领域,你可能会发现新的世界。
106 10
|
7月前
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
186 19
|
7月前
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
184 20
|
6月前
|
机器学习/深度学习 开发框架 API
Python 高级编程与实战:深入理解 Web 开发与 API 设计
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧以及数据科学和机器学习。本文将深入探讨 Python 在 Web 开发和 API 设计中的应用,并通过实战项目帮助你掌握这些技术。
|
7月前
|
监控 关系型数据库 MySQL
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
153 0
|
9月前
|
弹性计算 Java 数据库
Web应用上云经典架构实战
本课程详细介绍了Web应用上云的经典架构实战,涵盖前期准备、配置ALB、创建服务器组和监听、验证ECS公网能力、环境配置(JDK、Maven、Node、Git)、下载并运行若依框架、操作第二台ECS以及验证高可用性。通过具体步骤和命令,帮助学员快速掌握云上部署的全流程。
207 1
|
9月前
|
安全 应用服务中间件 网络安全
实战经验分享:利用免费SSL证书构建安全可靠的Web应用
本文分享了利用免费SSL证书构建安全Web应用的实战经验,涵盖选择合适的证书颁发机构、申请与获取证书、配置Web服务器、优化安全性及实际案例。帮助开发者提升应用安全性,增强用户信任。

热门文章

最新文章