登录
首页 >  Golang >  Go问答

使用自定义的“fs.FS”封装“fs.FS”导致“fs.Glob()”未返回匹配项

来源:stackoverflow

时间:2024-02-20 13:00:20 181浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《使用自定义的“fs.FS”封装“fs.FS”导致“fs.Glob()”未返回匹配项》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

我在应用程序中嵌入了一些文件并使用 embed.fs 访问它们。在某些时候,我在代码中使用 fs.glob(embedfs, ...) 。一切都按预期进行。现在我需要在继续处理文件内容之前用空格替换换行符。我可以读取整个文件并执行类似 bytes.replaceall(...) 之类的操作,但我想让它变得更好一点,并且在使用我的包时不要求进行替换(尽管我可以从用户)。我决定围绕 fs.fs (和 fs.file)实现一个包装器,用于在读取文件时处理替换。但我的实现破坏了 fs.glob() 因为它不返回任何匹配项:

type noLineBreakFile struct {
    file fs.File
}

func (f *noLineBreakFile) Stat() (fs.FileInfo, error) {
    return f.file.Stat()
}

func (f *noLineBreakFile) Read(p []byte) (n int, err error) {
    n, err = f.file.Read(p)
    pp := bytes.ReplaceAll(p, []byte{'\n'}, []byte{' '})
    copy(p, pp)
    return
}

func (f *noLineBreakFile) Close() error {
    return f.file.Close()
}

type noLineBreakFS struct {
    fs fs.FS
}

func (fs *noLineBreakFS) Open(name string) (fs.File, error) {
    f, err := fs.fs.Open(name)
    if err != nil {
        return nil, err
    }
    return &noLineBreakFile{f}, nil // <- returning f without the wrapper works fine
}

//go:embed *.tmpl
var embedFS embed.FS

func main() {
    matches, err := fs.Glob(embedFS) // Works fine ...
    fmt.Println(matches, err)

    matches, err = fs.Glob(&noLineBreakFS{embedFS}) // No matches!
    fmt.Println(matches, err)
}

我的 fs.file (nolinebreakfile) 的实现有什么问题?


正确答案


实现 ReadDirFile 以便 glob 可以读取目录条目。

func (nfs *noLineBreakFS) ReadDir(name string) ([]fs.DirEntry, error) {
    return fs.ReadDir(nfs.fs, name)
}

今天关于《使用自定义的“fs.FS”封装“fs.FS”导致“fs.Glob()”未返回匹配项》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>