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

3 回复

我不太明白你想做什么。如果你需要一个 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/memfsgithub.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流媒体分割。

回到顶部