Golang中有哪些实用的IO库推荐
Golang中有哪些实用的IO库推荐 Go 语言的 io.Reader/Writer 对于流式数据输入/输出非常有用 但 Golang 的实现(bufio、strings.Reader、bytes.Reader、bytes.Buffer)过于简单 是否有任何有用的第三方 io 库? 我需要一个实现了 Reader 和 Seeker 方法的 io 库,以及一个多路读取器 以下是伪代码
// ReadSeeker
NewReadSeeker(reader io.Reader) ReadSeeker{}
func (ReadSeeker) Read(b []byte) (int,error){}
func (ReadSeeker) Seek(offset int64, whence int) (int64, error){}
// MultiReader
// It will cache reader with size ,and return num io.Reader for downstream user
NewMultiReader(reader io.Reader, size, num int) []io.Reader {}
更多关于Golang中有哪些实用的IO库推荐的实战教程也可以访问 https://www.itying.com/category-94-b0.html
我不太明白你想做什么。如果你需要一个 io.ReadSeeker,你可以使用 *os.File。或者你想要一个内存中的东西?如果是这样,为什么?
我也看不出你的示例 MultiReader 函数应该做什么。你能具体说明你遇到的问题吗?
更多关于Golang中有哪些实用的IO库推荐的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我有一个处理WAV文件的HTTP服务器,需要分析WAV文件头,然后重新打包文件头和数据传递给下游函数,因此我需要类似Seek的功能来重置读取器。
NewMultiReader非常有用,就像在计算哈希时保存数据一样。
func main() {
fmt.Println("hello world")
}
在Go中,实现Reader和Seeker的第三方库可以考虑使用github.com/psanford/memfs或github.com/spf13/afero,它们提供了内存文件系统支持,可以满足ReadSeeker需求。对于多路读取器,github.com/jbenet/go-context/io提供了带上下文的IO包装器,但需要自行实现缓存分割逻辑。
以下是示例代码:
// 使用afero实现ReadSeeker
package main
import (
"github.com/spf13/afero"
"io"
)
func NewReadSeeker(reader io.Reader) (io.ReadSeeker, error) {
memFs := afero.NewMemMapFs()
file, err := memFs.Create("temp")
if err != nil {
return nil, err
}
_, err = io.Copy(file, reader)
if err != nil {
return nil, err
}
_, err = file.Seek(0, io.SeekStart)
if err != nil {
return nil, err
}
return file, nil
}
// 自定义MultiReader实现
type cachedReader struct {
src io.Reader
buffer []byte
pos int
}
func (c *cachedReader) Read(p []byte) (int, error) {
if c.pos >= len(c.buffer) {
n, err := c.src.Read(p)
if err != nil && err != io.EOF {
return n, err
}
c.buffer = append(c.buffer, p[:n]...)
c.pos += n
return n, err
}
n := copy(p, c.buffer[c.pos:])
c.pos += n
if c.pos == len(c.buffer) {
return n, io.EOF
}
return n, nil
}
func NewMultiReader(reader io.Reader, size, num int) []io.Reader {
readers := make([]io.Reader, num)
for i := 0; i < num; i++ {
readers[i] = &cachedReader{
src: reader,
buffer: make([]byte, 0, size),
pos: 0,
}
}
return readers
}
对于更专业的流处理,github.com/rwcarlsen/goexif/exif提供了EXIF数据读取的ReadSeeker实现,github.com/ulikunitz/xz提供了XZ压缩格式的ReadSeeker支持。如果需要网络流的多路读取,可以考虑github.com/grafov/m3u8用于HLS流媒体分割。

