无法理解go embed。

huangapple go评论82阅读模式
英文:

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

huangapple
  • 本文由 发表于 2023年1月27日 05:50:01
  • 转载请务必保留本文链接:https://go.coder-hub.com/75251998.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定