当前位置: 首页 > news >正文

12 Go的接口

概述

        在上一节的内容中,我们介绍了Go的作用域,包括:局部作用域、全局作用域、命名空间作用域等。在本节中,我们将介绍Go的接口。Go语言中的接口是一种类型,它定义了一组函数的集合。接口是一种抽象的描述,它定义了一个对象的行为,而不关心对象的具体类型。通过接口,可以实现多态性,即一个对象可以实现多个接口,从而实现不同接口的行为。

        在Go语言中,接口是一种定义了一组函数签名的抽象类型。这些函数签名包括:函数的名称、参数列表和返回类型。一个类型如果满足某个接口的所有函数,则称该类型实现了该接口。

定义接口

        可以通过type关键字和大括号{}来定义接口,其定义格式如下:

type 接口名称 interface {函数1(参数列表) 返回值列表函数2(参数列表) 返回值列表// 更多函数
}

        在下面的示例代码中,我们定义了一个名为Shape的接口,其中包含Area()和Perimeter()两个函数。

type Shape interface {Area() float64Perimeter() float64
}

实现接口

        要实现一个接口,需要在类型中实现接口中定义的所有函数。另外,函数的签名必须与接口中定义的函数一致。Go语言中的接口是隐式实现的,也就是说,如果一个类型实现了一个接口定义的所有函数,那么它就自动地实现了该接口。

        在下面的示例代码中,Rectangle类型实现了Shape接口的所有函数。这样,Rectangle对象就可以赋值给Shape类型的变量,并且可以通过Shape类型的变量调用这些函数。

type Rectangle struct {width float64height float64
}func (r Rectangle) Area() float64 {return r.width * r.height
}func (r Rectangle) Perimeter() float64 {return 2 * (r.width + r.height)
}

使用接口

        使用接口时,可以将实现了接口的类型赋值给接口类型的变量。比如:可以将一个Rectangle类型的结构体赋值给Shape接口类型的变量s,赋值后,变量s引用了Rectangle类型,并且可以使用Shape接口中定义的函数。

        在下面的示例代码中,我们首先定义了一个Shape接口,它包含了两个函数:Area()和Perimeter()。然后,我们分别定义了Rectangle和Circle两个结构体,并为它们实现了Area()和Perimeter()函数。这两个结构体分别实现了Shape接口的函数,因此它们可以被赋值给Shape类型的变量。在main()函数中,我们分别创建了一个矩形和一个圆形对象,并将它们赋值给了Shape接口变量s。最后,我们通过调用s.Area()和s.Perimeter()函数来计算它们的面积和周长,并打印结果。

package mainimport "fmt"// 定义一个形状的接口
type Shape interface {Area() float64Perimeter() float64
}// 定义一个矩形结构体,并实现Shape接口的函数
type Rectangle struct {width float64height float64
}func (r Rectangle) Area() float64 {return r.width * r.height
}func (r Rectangle) Perimeter() float64 {return 2 * (r.width + r.height)
}// 定义一个圆形结构体,并实现Shape接口的函数
type Circle struct {radius float64
}func (c Circle) Area() float64 {return 3.14 * c.radius * c.radius
}func (c Circle) Perimeter() float64 {return 2 * 3.14 * c.radius
}func main() {rectangle := Rectangle{width: 66, height: 10}// /将Rectangle对象赋值给Shape接口类型的变量var shape Shape = rectangle// 调用Shape接口的函数fmt.Println("Area:", shape.Area())fmt.Println("Perimeter:", shape.Perimeter())circle := Circle{radius: 10}// /将Circle对象赋值给Shape接口类型的变量shape = circle// 调用Shape接口的函数fmt.Println("Area:", shape.Area())fmt.Println("Perimeter:", shape.Perimeter())
}

        在Go语言中,接口提供了一种抽象的描述,可以用来定义对象的行为,任何实现了接口中定义的所有函数的类型都被认为是实现了该接口。通过使用接口,我们可以实现多态性、组合和依赖注入等功能,使代码更加灵活、可复用和易于维护。

空接口

        在Go语言中,空接口是一种特殊的接口类型,它没有任何函数定义。空接口可以表示任何类型的值,因为它没有任何限制。空接口的定义使用一对空的大括号来表示,如下:

          var emptyInterface interface{}

        通过将一个值赋给空接口变量,可以将其转换为任意类型。其他任何类型的值都可以赋值给空接口变量,因为空接口可以适应任何类型。

        在下面的示例代码中,我们声明了一个空接口变量emptyVar,然后分别将其赋值为整数、字符串和自定义结构体类型。由于空接口可以适应任何类型,这些赋值都是有效的。

package mainimport "fmt"func main() {var emptyVar interface{}emptyVar = 66// 输出: 66fmt.Println(emptyVar)emptyVar = "Hello, CSDN"// 输出: Hello, CSDNfmt.Println(emptyVar)type Person struct {name stringage  int}emptyVar = Person{name: "Mike", age: 32}// 输出: {Mike 32}fmt.Println(emptyVar)
}

        使用空接口可以在程序中实现更灵活和可扩展的逻辑,但需要注意的是:使用空接口时需要小心类型转换的安全性,因为空接口变量中存储的值可能与你预期的类型不同。建议在使用空接口时,进行类型断言以确保类型的安全性。

相关文章:

  • System.lineSeparator() 解决 append(“\r\n“) 换行符抛异常:No such file or diretory
  • 【C++】:STL——标准模板库介绍 || string类
  • how to find gcc openbug
  • 【计算机网络】TCP协议
  • 【Kingbase FlySync】命令行:同步软件安装部署,并实现KES到KES实现同步迁移
  • 基于pytest-bdd的项目目录结构和命名规范
  • 用照片预测人的年龄【图像回归】
  • 我记不住的getopt_long的那些参数和返回值
  • 【7】Spring Boot 3 集成组件:缓存组件 spring cache + spring data redis
  • AI变现之Gpts搞流量+赚钱
  • Django_学习
  • <MySQL> 查询数据进阶操作 -- 聚合查询
  • ClickHouse SQL操作
  • Ubuntu18.04编译OpenCV时遇到无法下载ADE的问题
  • RabbitMQ传统数据持久化和Lazy queue的区别
  • conda常用的命令
  • Consul Config 使用Git做版本控制的实现
  • express + mock 让前后台并行开发
  • gcc介绍及安装
  • HTTP--网络协议分层,http历史(二)
  • JS题目及答案整理
  • Python连接Oracle
  • Webpack 4x 之路 ( 四 )
  • WePY 在小程序性能调优上做出的探究
  • windows-nginx-https-本地配置
  • 阿里研究院入选中国企业智库系统影响力榜
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 动态规划入门(以爬楼梯为例)
  • 简单易用的leetcode开发测试工具(npm)
  • 扑朔迷离的属性和特性【彻底弄清】
  • 前端相关框架总和
  • 说说动画卡顿的解决方案
  • 微信小程序:实现悬浮返回和分享按钮
  • 在electron中实现跨域请求,无需更改服务器端设置
  • #{} 和 ${}区别
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #在 README.md 中生成项目目录结构
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (SpringBoot)第二章:Spring创建和使用
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (九)c52学习之旅-定时器
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (转)ObjectiveC 深浅拷贝学习
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ... 是什么 ?... 有什么用处?
  • .md即markdown文件的基本常用编写语法
  • .naturalWidth 和naturalHeight属性,
  • .NET面试题(二)
  • .net中调用windows performance记录性能信息
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @Not - Empty-Null-Blank