英文:
Failing to understand go embed
问题
目标是将一个目录树嵌入到我的二进制文件中,然后稍后将其复制到用户目录中。它主要由文本文件组成。我试图在项目中显示该子目录中文件的内容,该子目录名为.config
(因此使用了go:embed all)。
根据我对Go嵌入的理解,下面的代码应该在其自己的目录之外工作,但在执行时,它只列出了目录树中第一个文件的名称,但无法打开或显示其内容。在其自己的项目目录中,它可以正常工作。
//go:embed all:.config
var configFiles embed.FS
func main() {
ls(configFiles)
}
func ls(files embed.FS) error {
fs.WalkDir(files, ".", func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if !d.IsDir() {
show(path) // 显示文件的内容
}
return nil
})
return nil
}
(完整代码位于https://go.dev/play/p/A0HzD0rbvX-,但由于没有.config目录,它无法正常工作)
英文:
Goal is to embed a directory tree in my binary, then copy it to a user directory later. It consists mostly of text files. I am attempting to display contents of the files in that subdirectory within the project, named .config
(hence the use of go:embed all).
As I understand Go embedding, the following should work outside its own directory, but when executed, lists the name of the first
file in the directory tree but cannot open it or display its contents. Within its own project directory it works fine.
//go:embed all:.config
var configFiles embed.FS
func main() {
ls(configFiles)
}
func ls(files embed.FS) error {
fs.WalkDir(files, ".", func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if !d.IsDir() {
show(path) // Display contents of file
}
return nil
})
return nil
}
(Complete code at https://go.dev/play/p/A0HzD0rbvX- but it doesn't work because there's no .config directory)
答案1
得分: 2
程序遍历嵌入式文件系统,但使用操作系统打开文件。修复方法是在文件系统中打开文件。
将文件系统传递给show
函数:
if !d.IsDir() {
show(files, path) // <-- 在这里传递文件系统
}
使用文件系统打开文件:
func show(files fs.FS, filename string) { // <-- 在这里添加参数
f, err := files.Open(filename) // <-- 使用FS.Open打开文件
}
英文:
The program walks the embedded file system, but opens files using the operating system. Fix by opening the file in the file system.
Pass the file system to show
:
if !d.IsDir() {
show(files, path) // <-- pass files here
}
Open the file using the file system:
func show(files fs.FS, filename string) { // <-- add arg here
f, err := files.Open(filename) // <-- FS.Open
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论