首页 > 其他分享 >在Go语言中如何避免接口污染

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

时间:2024-03-31 18:29:05浏览次数:17  
标签:Writer 写入 接口 污染 io Reader 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,代码将保持不变&#

标签:Writer,写入,接口,污染,io,Reader,Go
From: https://blog.csdn.net/canglonghacker/article/details/137163137

相关文章

  • python(django)之单一接口管理功能后台开发
    1、创建数据模型在apitest/models.py下加入以下代码classApis(models.Model):Product=models.ForeignKey('product.Product',on_delete=models.CASCADE,null=True)#关联产品IDapiname=models.CharField('接口名称',max_length=100)apiurl=mod......
  • java的抽象类和接口
    抽象类:abstract,可以用此关键字修饰类和方法abstract修饰类就是抽象类,修饰方法就是抽象方法抽象类的注意事项,特点:抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类类该有的成员(成员变量,方法,构造器)抽象类也可以有抽象类的特点:抽象类不能创建对象,仅仅作为一种特殊的父......
  • MongoDB聚合运算符:$literal
    文章目录MongoDB聚合运算符:$literal语法使用举例把$作为文本投影一个值为1的新字段MongoDB聚合运算符:$literal$literal聚合运算符返回一个不进行解析的值。用于聚合管道可解释为表达式的值。语法{$literal:<value>}使用如果<value>是一个表达式,$literal不......
  • 接口文档神器apidoc
    1、apidoc介绍1、apidoc是什么?api文档生成工具:基于源代码备注创建的接口文档;2、apidoc优势是啥?超简单文档生成器:几乎支持目前主流的所有风格的注释,如可在C#、Go、python、Java、JavaScript、PHP等语言中使用。便于管理和查看:有利于代码的阅读同时,也减轻文档编写工......
  • [GO-LANG] Why is my trivial program such a large binary?
     Whyismytrivialprogramsuchalargebinary?Thelinkerinthe gc toolchaincreatesstatically-linkedbinariesbydefault.AllGobinariesthereforeincludetheGoruntime,alongwiththerun-timetypeinformationnecessarytosupportdynamictypech......
  • 为什么Java接口接收请求整型数据需要使用包装类Long
    在Java中,接口(Interface)是抽象方法的集合,它定义了对象之间交互的契约。但是,接口本身并不直接处理数据。当你说“Java接口接收请求整型数据需要使用包装类Long”,我猜你可能是指在某个方法签名中,接口定义了一个接收Long类型参数的方法,而不是基本类型int。原因主要有以下几点:可......
  • django打包成exe格式
    #-*-mode:python;coding:utf-8-*-frompathlibimportPathimportPyInstaller.utils.hooksimportmonaifromPyInstaller.utils.hooksimportcollect_data_filesfromPyInstaller.building.apiimportPYZ,EXE,COLLECT#收集monai相关的文件monai_datas=[......
  • Go 源码之 Chan
    Go源码之chango源码之chan-Jxy博客一、总结chan提供了一种在goroutine之间进行数据交换和同步的方式。通道可以用于控制并发访问和共享数据,从而减少竞态条件和死锁问题,并且可以自然地处理异步事件和信号。如果你的应用程序需要在goroutine之间传递数据或消息,那......
  • 滑动窗口算法(Sliding Window Algorithm)
    滑动窗口的核心就是,右指针给窗口扩容,直至抵达扩容限制条件或抵达边界;左指针则是给窗口缩容,以释放限制条件的约束,保证窗口继续向边界移动。需求讲解给定一个字符串str,请找出其中不含有重复字符的最长子串的长度。publicstaticintlengthOfLongestSubstring(Stringstr){......
  • 渗透项目1-GoldenEye
    靶机地址:https://www.vulnhub.com/entry/goldeneye-1,240/靶机难度:中等(CTF)目标:得到root权限&找到flag.txt信息收集收集目标iparp-scan-l(收集本地网络中的活跃主机的IP地址和MAC地址。)kaliarp-scan网络扫描工具扫描局域网ip地址-阿里云开发者社区(aliyun.com)......