【问题标题】:Need to generate runtime binary encoded file in golang需要在golang中生成运行时二进制编码文件
【发布时间】:2019-03-06 18:21:57
【问题描述】:

我正在处理需要生成二进制编码(字节)文件的项目。问题是,我不想存储文件,只需要编码数据来验证一些测试数据。

这是我的示例代码zip file

以上示例适用于zip,但我不限于使用zip 或任何文件类型。在这里我们需要存储文件来读取,但我不想稍后存储和删除文件。

我知道寻求帮助的努力并不多,但作为一个新手,我只来了。

谢谢。

【问题讨论】:

  • 不清楚你想创建什么以及你想如何使用它。通常,您可以只使用内存缓冲区,无论是简单的[]byte 还是实现io.Readerio.Writerbytes.Buffer,因此您可以像文件一样使用它来读写。
  • 实际上我有像test cases 这样的场景,我需要一个虚拟的文件编码字节(但不想创建它)并且需要检查其他数据。否则我必须创建一个文件然后执行操作,但我没有确定的场景来删除它(虽然我不能保留它)
  • 您应该将用例更改为不依赖具体的os.File 类型,而是使用接口(@98​​7654330@、io.Writer 和类似的)。这样,无论您传递 *bytes.Buffer 还是 *os.File,它都可以同时使用。
  • @icza 你想让我改变功能吗?将其视为测试用例,那么我们如何生成虚拟文件的字节数?

标签: file go encode


【解决方案1】:

更好的做法是不要依赖具体类型(例如os.File),而是使用接口来描述您要使用文件的功能。

例如如果你有一个函数需要一个文件,因为它想从中读取,请改用io.Reader

func process(r io.Reader) error {
    // ...
}

同样,如果您想写入文件,请使用io.Writer,或者如果您想同时执行这两种操作,请使用io.ReadWriterio.ReadWriteCloser。您可以将*os.File 值传递给这些函数,因为*os.File 实现了这些接口。

这样做的好处是您可以使用任何实现接口的值来调用这些函数。如果你想测试这些函数,你可以传递一个内存中的bytes.Buffer,它实现了io.Readerio.Writer,你可以在运行时手动构造它的内容,例如:

buf := &bytes.Buffer{}
buf.Write([]byte{1, 2, 3})
buf.WriteString("Hello")

这里buf 将包含字节123 和字符串"Hello"。之后,您可以传递buf 需要读者或作家的地方,例如:

process(buf)

查看类似/相关的问题和示例:

Fill os.Stdin for function that reads from it

Example code for testing the filesystem in Golang

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多