在Go语言中如何避免接口污染

        在设计和构造代码时,接口是Go语言的基石之一。然而,就像许多工具或概念一样,滥用它们通常不是一个好主意。接口污染就是用不必要的抽象使我们的代码变得难以理解。这是来自另一种编程语言具有不同习惯的开发人员经常犯的错误。在深入讨论这个话题之前,让我们重新思考一下Go的接口。然后,我们将看到什么时候使用接口是合适的,什么时候可能被认为是污染。

1.概念 

        接口提供了一种方法来指定对象的行为。我们使用接口来创建多个对象实现的公共抽象。Go接口与其他接口的不同之处在于它们是隐式的,没有像implements这样的显式关键字来标记对象X实现了接口Y。

        为了理解是什么使接口如此强大,我们将深入研究标准库中的两个流行接口:io.Reader和io.Writer包为I/O原语提供抽象。在这些抽象概念中,io.Reader涉及从数据源读取数据,io.Writer向目标写入数据。如下图所示

io.Reader只包含一个Read方法:

typer Reader interface {Read(p []byte)(n int,err error)
}

io.Reader接口的自定义实现是接收了一个字节切片,用接收的数据填充字节切片,并返回读取的字节数或一个错误。

另一方面,io.Writer定义了一方法Writer:

type Writer interface {Write(p []byte) (n int,err error)
}

io.Writer接口的自定义实现是将来自字节片的数据写入目标,并返回写入的字节数或一个错误。因此,这两个接口都提供了基本的抽象:

  • io.Reader 从源读取数据
  • io.Writer 将数据写入目标

        那么在该语言中使用这两个接口的基本原理是什么?创建这些抽象的意义是什么?

        假设我们需要实现一个函数,该函数将一个文件的内容复制到另一个文件。我们可以创建一个特定的函数,将两个*os.Files作为输入。或者,我们可以选择使用io.Reader和io.Writer抽象创建一个更泛型的函数:

func copySourceToDest(source io.Reader, dest io.Writer) error {//...
}

这个函数可以与参数*os.File及实现这些接口的任何其他类型一起工作。例如,我们可以创建自己的写入数据库的io.Writer,代码将保持不变&#

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

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

相关文章

Java文件内容查找:简单实现与应用

一、Java文件内容查找的基本原理 在Java中,文件内容查找可以通过读取文件并逐行检查每一行内容来实现。基本的流程包括以下几个步骤: 打开文件:使用Java的文件操作类(如FileInputStream)打开要查找的文件。 逐行读取…

算法练习----力扣每日一题------6

原题链接: 1379. 找出克隆二叉树中的相同节点 - 力扣(LeetCode) 题目解析: 给两个二叉树,original和它的克隆树cloned,二者存的数据和数据的相对位置完全一样,给一个o树里的节点target,求对应的…

Kotlin作用域函数:let、also、run、apply、with

​​​​​​​ let函数 使用场景:可空变量的操作,无需判空 p?.let {it.name "lily"it.age "21"} also函数 使用场景:多个扩展函数链式调用(返回值是本身) p?.also {it.name "den…

HCIA-RS基础-VLAN技术原理和配置

目录 VLAN 技术原理和配置1. VLAN 技术的背景2. VLAN 标签的产生方法3. VLAN 标签的应用规则4. VLAN 的配置总结 VLAN 技术原理和配置 1. VLAN 技术的背景 VLAN(Virtual Local Area Network)是一种逻辑上划分网络的技术,可以将一个物理局域…

Postman 请求参数传递指南:Query、Path 和 Body 详解

Postman 是一个非常流行的 API 开发环境,它允许开发者测试、开发和文档化他们的 API。在 Postman 中,当你发送一个请求时,你可能需要将参数传递给服务器。这些参数可以通过不同的方式传递,例如 Query Parameters(查询参…

使用 select 标签,1 分钟完成一个简单的下拉菜单

在网上冲浪时,我们经常遇到需要做出选择的情况,比如选择你喜爱的电影类型、预订酒店的房间类型或者在网购时挑选衣服的尺码。 这些选择往往通过一个简洁明了的下拉菜单来实现,让我们的决策过程变得轻松愉快。这个神奇的下拉菜单,…

算法打卡day25

今日任务: 1)491.递增子序列 2)46.全排列 3)47.全排列 II 491.递增子序列 题目链接:491. 非递减子序列 - 力扣(LeetCode) 给定一个整型数组, 你的任务是找到所有该数组的递增子序列&#xff0c…

composure合成透明通道

composure合成透明通道 2022-05-23 08:59 [技巧分享]使用配有HDRI的背板的进行合成 Using Composure with a Bac - 1.Using Composure with a Backplate and H.mp41启用插件2线性色彩空间3打开合成面板4面板新建合成新建三个图层 FG前面物体,背景物体 去掉阴影 flo…

Zabbix6 - Web管理网络拓扑/端口流量监控配置手册

Zabbix6 - Web管理网络拓扑/端口流量监控配置手册 概述: 1)Zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 Zabbix由两部分构成,Zabbix Server与可选组件Zabbix Agent。通过C/S模式采集数据,通过B…

60道Java经典面试题总结

1、Spring 有几种配置方式&#xff1f; 1、xml 配置文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:…

量化交易入门(四十一)ASI指标Python实现和回测

老规矩先上图&#xff0c;看看ASI指标使用苹果数据回测后的结果如何。 一、策略运行结果 执行的结果&#xff1a; Starting Portfolio Value: 100000.00 Final Portfolio Value: 92514.82 Annualized Return: -1.93% Sharpe Ratio: -0.27 Max Drawdown: 25.34% Max Drawdown …

【教学类-09-04】20240401细线迷宫图03(A4横版一页-4份横版)

作品展示&#xff1a; 背景需求&#xff1a; 【教学类-09-02】20240331细线迷宫图01&#xff08;A4横版一页1份横版&#xff09;-CSDN博客文章浏览阅读779次&#xff0c;点赞28次&#xff0c;收藏6次。【教学类-09-02】20240331细线迷宫图01&#xff08;A4横版一页1份横版&…

pm2进程监控

pm2 npm install -g pm2 npm install -g pm2-web //linux有效 command pm2 logs&#xff0c;实时显示日志pm2 list&#xff0c;查看启动进程pm2 stop id[name]&#xff0c;关闭进程&#xff0c;all所有pm2 kill&#xff0c;关闭所有pm2 monit&#xff0c;查看详细信息pm2 star…

汽车电子行业知识:UWB技术及应用

文章目录 1.什么是UWB技术1.1.UWB测距原理1.2.UWB数据传输原理2.汽车UWB技术应用2.1.UWB雷达2.1.1.信道的冲击响应CIR2.2.舱外检测目标2.3.舱内检测活体2.3.1.活体检测原理2.4.脚踢尾箱开门2.4.1.脚踢检测原理1.什么是UWB技术 UWB(ultra wideband)也叫超宽带技术,是一种使用…

机器学习周记(第三十二周:文献阅读-时空双通路框架)2024.3.25~2024.3.31

目录 摘要 ABSTRACT 1 论文信息 1.1 论文标题 1.2 论文摘要 1.3 论文模型 1.3.1 Spatial Encoder&#xff08;空间编码器&#xff09; 1.3.2 Temporal Encoder&#xff08;时间编码器&#xff09; 2 相关代码 摘要 本周阅读了一篇运用GNN进行时间序列预测的论文。论文…

【数据处理包Pandas】分组及相关操作

目录 一、初步认识分组并查看分组信息&#xff08;一&#xff09;通过聚合函数查看分组信息&#xff08;二&#xff09;转换成列表查看所有组的信息&#xff08;三&#xff09;通过循环查看各组的名称和组中的数据信息&#xff08;四&#xff09;通过get_group()方法直接获得一…

速盾:怎么通过cdn防御ddos

随着互联网的发展&#xff0c;网络安全问题日益突出&#xff0c;其中DDoS&#xff08;分布式拒绝服务&#xff09;攻击成为最常见的一种攻击手段。这种攻击方式通过利用大量的请求来占用服务器资源&#xff0c;导致正常用户无法访问网站。为了防御DDoS攻击&#xff0c;CDN&…

【蓝桥杯练习】tarjan算法求解LCA

还是一道比较明显的求LCA(最近公共祖先)模型的题目,我们可以使用多种方法来解决该问题&#xff0c;这里我们使用更好写的离线的tarjan算法来解决该问题。 除去tarjan算法必用的基础数组&#xff0c;我们还有一个数组d[],d[i]记录的是每个点的出度&#xff0c;也就是它的延迟时间…

高级IO/多路转接-select/poll(1)

概念背景 IO的本质就是输入输出 刚开始学网络的时候&#xff0c;我们简单的写过一些网络服务&#xff0c;其中用到了read&#xff0c;write这样的接口&#xff0c;当时我们用的就是基础IO&#xff0c;高级IO主要就是效率问题。 我们在应用层调用read&&write的时候&…

YOLOv2

YOLOv2 论文介绍论文改进1. Batch Normalization2. High Resolution Classifier3. Convolutional With Anchor Boxes4. vgg16换成darknet-195. Dimension Clusters&#xff08;w h的聚类&#xff09;6 预测坐标7. passthrough8. 多尺度输入训练 损失函数 论文介绍 论文名字&am…