在golang中将[]字节转换成“虚拟”文件对象的简单方法?
我知道有Go库可以创建整个文件系统,例如VFS。但是我只想将字节数组变成可以满足File接口的对象。
回答:
标准库中尚无现成的解决方案,但您自己做起来并不难。
我们需要的是此http.File
接口:
type File interface { io.Closer
io.Reader
io.Seeker
Readdir(count int) ([]os.FileInfo, error)
Stat() (os.FileInfo, error)
}
请注意,我们可以利用它bytes.Reader
来完成繁重的任务,因为这是单独实现io.Reader
和的io.Seeker
。io.Closer
可以是noop,并且Readdir()
可能nil,
nil在模拟文件而不是目录时返回,Readdir()
甚至不会被调用。
“最难”的部分是模拟Stat()
返回实现的值os.FileInfo
。
这是一个简单的嘲笑FileInfo
:
type myFileInfo struct { name string
data []byte
}
func (mif myFileInfo) Name() string { return mif.name }
func (mif myFileInfo) Size() int64 { return int64(len(mif.data)) }
func (mif myFileInfo) Mode() os.FileMode { return 0444 } // Read for all
func (mif myFileInfo) ModTime() time.Time { return time.Time{} } // Return anything
func (mif myFileInfo) IsDir() bool { return false }
func (mif myFileInfo) Sys() interface{} { return nil }
这样,我们就拥有了创建模拟对象的一切http.File
:
type MyFile struct { *bytes.Reader
mif myFileInfo
}
func (mf *MyFile) Close() error { return nil } // Noop, nothing to do
func (mf *MyFile) Readdir(count int) ([]os.FileInfo, error) {
return nil, nil // We are not a directory but a single file
}
func (mf *MyFile) Stat() (os.FileInfo, error) {
return mf.mif, nil
}
使用它的示例(在Go Playground上尝试):
data := []byte{0, 1, 2, 3}mf := &MyFile{
Reader: bytes.NewReader(data),
mif: myFileInfo{
name: "somename.txt",
data: data,
},
}
var f http.File = mf
_ = f
以上是 在golang中将[]字节转换成“虚拟”文件对象的简单方法? 的全部内容, 来源链接: utcz.com/qa/418191.html