编程笔记 Golang基础 030 接口

编程笔记 Golang基础 030 接口

  • 一、接口的定义:
  • 二、接口的实现:
  • 三、接收者类型
  • 四、应用示例
  • 五、接口的意义

在Go语言中,接口是一种类型定义,它描述了一组方法签名,任何实现了这些方法的类型都隐式地实现了这个接口。这种机制为Go提供了轻量级的面向对象特性,特别是多态性。

一、接口的定义:

接口定义的关键字是 interface,其基本语法结构如下:

type InterfaceName interface {Method1(paramList) returnTypesMethod2(paramList) returnTypes// ...
}

例如,定义一个简单的名为 Usber 的接口,它包含两个方法 Start()Stop()

type Usber interface {Start()Stop()
}

这意味着任何实现了 Start()Stop() 两个方法(无论方法体如何实现)的类型都将自动成为 Usber 接口的实现者。

二、接口的实现:

在Go中,接口的实现是隐式的。也就是说,你不需要像其他一些语言那样明确声明一个类型要实现某个接口。只要一个类型具有与接口所需相同名称和签名的方法,就认为该类型实现了接口。

例如,我们可以创建一个 Phone 结构体并为其添加 StartStop 方法:

type Phone struct {Name string
}func (p Phone) Start() {fmt.Println(p.Name, "is starting...")
}func (p Phone) Stop() {fmt.Println(p.Name, "is stopping...")
}// 此时,Phone 类型已经实现了 Usber 接口

三、接收者类型

在Go语言中,接口定义并不直接涉及接收者,而是对接口方法的签名进行描述。但接口的实现通常会涉及到类型的方法以及这些方法的接收者类型。

当我们在一个类型上定义方法时,可以指定两种类型的接收者:

  1. 值接收者

    type MyType struct {// ...
    }func (t MyType) MyMethod() {// ...
    }
    

    在这个例子中,MyMethod 的接收者是 MyType 类型的一个副本(值)。这意味着如果方法内部试图修改接收者字段,修改不会影响调用方法时传递的实际结构体实例,因为操作的是接收者的副本而非原始实例。

  2. 指针接收者

    func (t *MyType) MyMethod() {// ...
    }
    

    当方法接收者为指针类型时(如上面的例子),对方法内部接收者所做的任何修改都将反映到实际的结构体实例上,因为它是指向结构体实例的引用。

接口与接收者的关系在于,无论接收者是值还是指针,只要接口所声明的方法能在给定类型上找到匹配的方法,那么该类型就实现了这个接口。例如,如果有一个接口:

type SomeInterface interface {MyMethod()
}

无论是具有值接收者还是指针接收者的 MyMethod 方法,只要它们有相同的函数签名(不考虑接收者是否是指针),对应的类型都可视为实现了 SomeInterface 接口。

四、应用示例

package mainimport ("fmt"
)// 定义接口
type Usber interface {Start()Stop()
}// 实现接口的类型
type Phone struct {Name string
}// 实现接口的方法
func (p Phone) Start() {fmt.Printf("%s is starting...\n", p.Name)
}func (p Phone) Stop() {fmt.Printf("%s is stopping...\n", p.Name)
}func main() {// 创建 Phone 对象device := Phone{Name: "iPhone X"}// 将 Phone 类型赋值给 Usber 接口var usber Usber = device// 通过接口调用方法usber.Start()usber.Stop()// 类型断言检查if _, ok := usber.(Phone); ok {fmt.Println("The device is a phone.")}
}

在这个示例中,我们首先定义了 Usber 接口,然后创建了一个 Phone 结构体,并实现了 StartStop 方法。在主函数中,我们将 Phone 类型的对象赋值给 Usber 接口变量,并通过接口调用了相应的 methods。最后,使用类型断言来检查接口变量所指向的具体类型,从而在运行时确认它是哪种类型的实例。

五、接口的意义

接口在Go语言中的重要性体现在以下几个方面:

  1. 抽象和多态

    • 接口提供了类型抽象,它定义了一组方法签名,任何实现了这些方法的类型都可视为该接口的实现者。这样就可以通过接口来操作多种类型的值,而不必关心它们的具体类型,从而实现了多态。
    • 这种机制使得Go程序员可以编写更通用、更灵活的代码,提高了代码的复用性和可扩展性。
  2. 依赖注入与模块解耦

    • 在软件设计中,接口有助于降低不同组件之间的耦合度。通过使用接口作为函数或结构体的参数类型,可以在不改变接口使用者的情况下更换不同的实现,便于进行单元测试和组件替换。
  3. 标准库与第三方包的统一交互

    • Go的标准库广泛使用了接口设计,比如 io.Readerio.Writer 接口被各种读写操作所采用,无论底层是文件、网络连接还是内存缓冲区,只要实现了相应的接口就能以统一的方式处理数据。
    • 第三方包也经常通过定义和实现接口来提供功能扩展点,用户可以根据需要自定义满足接口的对象,与第三方包无缝对接。
  4. 类型安全

    • 虽然Go没有传统的类继承机制,但接口帮助弥补了这一空缺。接口可以确保不同类型的行为一致性,保证了类型安全的同时也增强了程序的设计规范性。
  5. 反射(Reflection)支持

    • Go的反射包 reflect 配合接口能够动态地获取和操作对象的方法和属性,进一步提升了Go语言在运行时的灵活性。
  6. 面向服务架构(SOA)与微服务

    • 在构建微服务或面向服务架构应用时,接口常被用于定义服务间通信契约,使得服务间的交互更加清晰和一致。

综上所述,接口在Go语言中是实现抽象、封装变化、促进代码重用以及设计灵活且松散耦合系统的关键要素之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/702378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s-创建命名空间的方法

使用命令式创建namespace kubectl create namespace test-namespace查看命名空间 kubectl get namespace使用声明式创建命名空间 a. 编写dev-namespace.yaml文件 apiVersion: v1 kind: Namespace metadata:name: dev-namespaceb. 使用dev-namespace.yaml,yaml文件创…

音视频开发之旅(69)-SD图生图

目录 1. 效果展示 2. ControlNet介绍 3. 图生图流程浅析 4. SDWebui图生图代码流程 5. 参考资料 一、效果展示 图生图的应用场景非常多,比较典型的应用场景有风格转化(真人与二次元)、线稿上色、换装和对图片进行扩图等,下面…

TCP/IP协议栈:模拟器实现基本的L2和L3功能

在C中实现的TCPI/IP网络堆栈模拟器。该模拟器实现基本的第2层(MAC地址,Arp)和第3层(路由,IP)功能。 TCP/IP协议栈是一个网络通信的基础架构,包含了多层次的协议和功能。在模拟实现基本的L2和L3…

神经网络2-卷积神经网络一文深度读懂

卷积神经网络(Convolutional Neural Network, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),主要用于图像识别、语音识别和自然语言处理等任务,是深度学习&#xff0…

使用决策树算法预测隐形眼镜类型

目录 谷歌笔记本(可选) 编写算法:决策树 准备数据:拆分数据集 测试算法:构造注解树 使用算法:预测隐形眼镜类型 谷歌笔记本(可选) from google.colab import drive drive.mount…

ubuntu20.04 tvm 安装教程

ubuntu20.04 tvm 安装教程: 参考: 1. https://tvm.hyper.ai/docs/install/from_source/ 2. https://blog.csdn.net/wenwen_2020/article/details/134856293 步骤: 1. 创建容器:docker run -itd --name tvm --gpusall --ipchost…

Springboot之压缩逻辑源码跟踪流程

背景 在项目开发过程中,前后端参数比较多,导致网络传输耗时比较多,因此想将数据压缩传输,以减少网络传输的耗时,从而减少接口的响应时间,可以自己实现,但是spring相关的框架已经内置了该功能&am…

堆排序、快速排序和归并排序

堆排序、快速排序和归并排序是所有排序中最重要的三个排序,也是难度最大的三个排序;所以本文单独拿这三个排序来讲解 目录 一、堆排序 1.建堆 2.堆排序 二、快速排序 1.思想解析 2.Hoare版找基准 3.挖坑法找基准 4.快速排序的优化 5.快速排序非…

C语言--左旋字符/右旋字符实现及其判断

1.题目解释 左旋就是把对应的左边的放到右边 例如ABCDEF左旋2个字符就是BCDEFAB&#xff0c;左旋3个字符就是DEFABC&#xff1b; 2.代码实现 void leftmove(char* str, int k) {int j 0;assert(str);for (j 0; j < k; j){char temp *str;int len strlen(str);int i …

单个文件实现cpu的信息检测:ruapu.h的学习笔记

https://github.com/nihui/ruapu是nihui大佬开发的用单文件检测CPU特性的项目 ruapu.h的使用 "ruapu.h"主要提供了两个函数 ruapu_init 和 ruapu_supports&#xff0c;分别用于初始化和检测指令集支持。 // 使用示例见&#xff1a;https://github1s.com/nihui/rua…

MyBatis核心配置文件

1、properties属性&#xff1a; 将变量提取出来变成全局变量 enable-default-value&#xff1a;启动默认值 数据库环境四要素 2、settings属性 &#xff1a; 开启二级缓存&#xff0c;开启延迟加载懒加载 消极懒加载积极懒加载 <setting name"cacheEnable" valu…

Spring数据脱敏实现

在当今的数字化时代&#xff0c;数据安全和个人隐私保护变得日益重要。为了遵守各种数据保护法规&#xff0c;如欧盟的GDPR&#xff08;通用数据保护条例&#xff09;&#xff0c;企业在处理敏感信息时需要格外小心。数据脱敏是一种常见的技术手段&#xff0c;用于隐藏敏感数据…

Servlet使用Cookie和Session

一、会话技术 当用户访问web应用时&#xff0c;在许多情况下&#xff0c;web服务器必须能够跟踪用户的状态。比如许多用户在购物网站上购物&#xff0c;Web服务器为每个用户配置了虚拟的购物车。当某个用户请求将一件商品放入购物车时&#xff0c;web服务器必须根据发出请求的…

windows实现ip1:port1转发至ip2:port2教程

第一步&#xff1a;创建虚拟网卡(如果ip1为本机127.0.0.1跳过此步骤)&#xff0c;虚拟网卡的IPV4属性设置ip1 1> 创建虚拟网卡参见 Windows系统如何添加虚拟网卡&#xff08;环回网络适配器&#xff09;_windows添加虚拟网卡-CSDN博客​​​​​​ 2> 设置虚拟网卡使用…

MongoDB索引解析:工作原理、类型选择及优化策略

MongoDB&#xff0c;作为一款广受欢迎的NoSQL数据库&#xff0c;以其灵活的数据模型和出色的性能赢得了开发者的青睐。然而&#xff0c;随着数据量的不断增长和查询需求的日益复杂&#xff0c;如何确保高效的查询性能成为了关键。这时&#xff0c;索引的重要性便凸显出来。本文…

【Go的函数】

函数 函数的引入函数细节祥讲包的引入包的细节详讲init函数匿名函数闭包defer关键字系统函数字符串相关函数日期和时间相关函数内置函数 函数的引入 【1】为什么要使用函数&#xff1a; 提高代码的复用&#xff0c;减少代码的冗余&#xff0c;代码的维护性也提高了 【2】函数…

简单mock server模拟用户请求给小程序提供数据

整理小程序代码时发现一此小程序离开了mock-server基本上没有办法显示了,因此用node,express来满足给小程序提供演示数据的功能 const express require(express); const { createCanvas, Image } require(canvas); const fs require(fs); const path require(path);…

Python爬虫实战:图片爬取与保存

引言&#xff1a; 在本文中&#xff0c;我们将学习如何使用Python创建一个简单的图片爬虫。 我们将利用requests库来发送HTTP请求&#xff0c;BeautifulSoup库来解析HTML页面&#xff0c;以及os和shutil库来下载和保存图片。通过这个教程&#xff0c;你将学会如何爬取网…

你要不要搞副业

最近看到了几个网友关于年轻人要不要搞副业的一点讨论&#xff0c;学习到了很多。整理分享如下&#xff1a; plantegg 你要不要搞副业&#xff1f; 最近网上看到很多讨论搞副业和远程工作的&#xff0c;我也说点自己的经验看法 当然这完全是出于个人认知肯定不是完全对的、也…

react + Typescript 中 react有多少内置的类型 分别是什么

react Typescript 中 react有多少内置的类型 分别是什么 React 和 TypeScript 结合使用时&#xff0c;React 提供了一系列的内置类型&#xff08;也称为类型定义或类型别名&#xff09;来帮助你在 TypeScript 中编写类型安全的代码。这些类型定义涵盖了 React 的各个方面&…