在Go中复制文件最流行的3种方法

 更新时间:2018年10月10日 10:27:51   作者:Mihalis Tsoukalos  
今天小编就为大家分享一篇关于在Go中复制文件最流行的3种方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

本文将向您展示如何在GO编程语言。尽管Go中有三种以上的复制文件的方法,但本文将介绍三种最常见的方法:这三种方法各有利弊,我们只需要在应用中选择最合适的即可,不必盲目追求性能。
使用io.Copy()从GO库调用函数;一次性读取输入文件并将其写入另一个文件;并使用缓冲区以小块的形式复制文件。

方法1:使用io.Copy()

该实用程序的第一个版本将使用io.Copy()标准GO库的功能。实现中可以找到实用程序的逻辑。copy()职能如下:

除了测试要复制的文件是否存在外(os.Stat(src)),并且是一个常规文件(sourceFileStat.Mode().IsRegular())这样您就可以打开它阅读,所有的工作都是由io.Copy(destination, source)声明。这,这个,那,那个io.Copy()函数返回复制的字节数和复制过程中发生的第一条错误消息。在Go中,如果没有错误消息,则错误变量的值将为nil.

您可以了解更多关于io.Copy()在IO封装文件页。

执行cp1.go将生成下一种输出:

$ run cp1
Please provide two command line arguments
$ run cp1 fileCPtxt tmpfileCPCOPY
Copied bytes
$ diff fileCPtxt tmpfileCPCOPY

这种技术尽可能简单,但不给开发人员带来灵活性,这并不总是一件坏事。但是,有时开发人员需要或希望决定如何读取文件。

方法2:使用ioutil.WriteFile()和ioutil.ReadFile()

复制文件的第二种方法是使用ioutil.ReadFile()和ioutil.WriteFile()职能。第一个函数将整个文件的内容读入字节片,第二个函数将字节片的内容写入文件中。
实用程序的逻辑可以在以下GO代码中找到:

除了这两个if块,它们是工作方式的一部分,您可以看到程序的功能在ioutil.ReadFile()和ioutil.WriteFile()陈述。

执行cp2.go将生成下一种输出:

$ run cp2
Please provide two command line arguments
$ run cp2 fileCPtxt tmpcopyFileCP
$ diff fileCPtxt tmpcopyFileCP

请注意,尽管此技术将复制一个文件,但是当您想要复制大型文件时,它可能并不有效,因为ioutil.ReadFile()也将是巨大的。

方法3:使用os.Read()和os.Write()

在GO中复制文件的第三种方法是使用cp3.go将在本节中开发的实用程序。它接受三个参数:输入文件的文件名、输出文件的文件名和缓冲区的大小。

最重要的部分cp3.go驻留在以下for循环,可以在copy() function:

这种技术使用os.Read()用于将输入文件的一小部分读入名为buf和os.Write()将缓冲区的内容写入文件。当读取错误或到达文件末尾时,复制过程停止(io.EOF).

执行cp3.go将生成下一种输出:

$ run cp3
usage cp3 source destination BUFFERSIZE
$ run cp3 fileCPtxt tmpbuf10 
Copying fileCPtxt to tmpbuf10
$ run cp3 fileCPtxt tmpbuf20 
Copying fileCPtxt to tmpbuf20

如您所见,缓冲区的大小极大地影响了cp3.go.

做一些基准

本文的最后一部分将尝试比较这三个程序以及cp3.go对于不同的缓冲区大小,请使用time(1)命令行实用程序。

下面的输出显示了cp1.go, cp2.go,和cp3.go复制500 MB文件时:

输出结果表明,这三个实用程序的性能非常相似,这意味着标准GO库的功能非常聪明和优化。

现在,让我们测试缓冲区大小如何影响cp3.go。执行cp3.go如果缓冲区大小为10、20和1,000字节,以便在相当快的计算机上复制500MB文件,生成的输出显示,缓冲区越大,cp3.go实用程序,这或多或少是预期的。此外,使用小于20个字节的缓冲区大小复制大文件是一个非常缓慢的过程,应该避免。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • Golang中空的切片转化成 JSON 后变为 null 问题的解决方案

    Golang中空的切片转化成 JSON 后变为 null 问题的解决方案

    在 Golang 中,经常需要将其他类型(例如 slice、map、struct 等类型)的数据转化为 JSON 格式,有时候转化的结果并不是预期中的,例如将一个空的切片转化为 JSON 时,会变成"null",所以本文将给大家介绍一下解决方法,需要的朋友可以参考下
    2023-09-09
  • Go 实战单队列到优先级队列实现图文示例

    Go 实战单队列到优先级队列实现图文示例

    这篇文章主要为大家介绍了Go 实战单队列到优先级队列图文示例实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 详解如何用Golang处理每分钟100万个请求

    详解如何用Golang处理每分钟100万个请求

    在项目开发中,我们常常会遇到处理来自数百万个端点的大量POST请求,本文主要介绍了Golang实现处理每分钟100万个请求的方法,希望对大家有所帮助
    2023-04-04
  • 一文详解Golang的函数特性

    一文详解Golang的函数特性

    函数是 Golang 中非常重要的组成部分之一,它们提供了代码的可重用性和组织性。在本文中,我们将深入了解 Golang 函数的多个方面,希望对大家有所帮助
    2023-04-04
  • Golang TCP网络编程的具体实现

    Golang TCP网络编程的具体实现

    go语言是一门功能强大的编程语言,它提供了众多的网络编程库,其中包括tcp/ip,本文主要介绍了Golang TCP网络编程的具体实现,具有一定的参考价值,感兴趣的可以来了解一下
    2024-06-06
  • Go语言map元素的删除和清空

    Go语言map元素的删除和清空

    本文主要介绍了Go语言map元素的删除和清空,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 使用golang获取linux上文件的访问/创建/修改时间

    使用golang获取linux上文件的访问/创建/修改时间

    这篇文章主要介绍了使用golang获取linux上文件的访问/创建/修改时间,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • GO语言开发环境搭建过程图文详解

    GO语言开发环境搭建过程图文详解

    这篇文章主要介绍了GO语言开发环境搭建过程图文详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • goframe重写FastAdmin后端实现实例详解

    goframe重写FastAdmin后端实现实例详解

    这篇文章主要为大家介绍了goframe重写FastAdmin后端实现实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • golang xorm 自定义日志记录器之使用zap实现日志输出、切割日志(最新)

    golang xorm 自定义日志记录器之使用zap实现日志输出、切割日志(最新)

    这篇文章主要介绍了golang xorm 自定义日志记录器,使用zap实现日志输出、切割日志,包括连接postgresql数据库的操作方法及 zap日志工具 ,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10

最新评论