【问题标题】:ioutil.ReadAll alternative that only consumes data, without duplicating the byte arrayioutil.ReadAll 替代方案,只消耗数据,不复制字节数组
【发布时间】:2020-10-22 21:44:33
【问题描述】:

mux.HandleFunc 调用,我有一个http.Request.FormFile,它的类型是multipart.File。我正在对浏览器的文件上传速度进行基准测试,所以我不需要验证数据。我当前的代码是:

fileBytes, err := ioutil.ReadAll(file)
if err != nil {
    fmt.Println(err)
}
return len(fileBytes)

ioutil.ReadAll 制作不需要的副本。是否有其他方法可以验证我是否拥有所有数据而无需创建副本?

或者,我可以用什么替换len(fileBytes)?如果这应该在一个单独的问题中,您可以忽略它。

我尝试了什么

.ReadAll调用readAll调用bytes.Buffer.ReadFrom调用io.Reader.Read,我找不到。

【问题讨论】:

标签: go io reader


【解决方案1】:

使用io.Copy() 将文件内容复制到ioutil.Discard 中,ioutil.Discard 不存储但丢弃数据。 io.Copy()复制直到到达EOF(或发生错误),并返回复制的字节数:

n, err := io.Copy(ioutil.Discard, file)

【讨论】:

  • 为了完整起见(以及下一位读者),如果 OP 在真正的 OS 文件上运行,他们可以 seek 过去不需要的数据片段。
  • @kostix 或者更好,只需使用File.Stat()FileInfo.Size() 获取文件大小/长度。
猜你喜欢
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2011-02-13
  • 2014-10-10
  • 2014-03-08
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多