Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

55. embed.FS #55

Open
guonaihong opened this issue Apr 18, 2024 · 0 comments
Open

55. embed.FS #55

guonaihong opened this issue Apr 18, 2024 · 0 comments

Comments

@guonaihong
Copy link
Owner

guonaihong commented Apr 18, 2024

embed.FS的匹配规则

在 Go 中,embed.FS 是一种特殊的文件系统接口,用于将文件或整个目录嵌入到 Go 二进制文件中。这个功能非常有用,可以避免在运行时访问外部文件系统,从而提高了应用程序的可移植性和安全性。

embed.FS 的匹配规则相对简单,但需要注意一些细节。它会从当前 Go 源文件所在的目录开始,向下搜索匹配的文件或目录。因此,在使用 //go:embed 指令时,您需要提供相对于当前目录的路径。

让我们通过一个具体的示例来理解这个规则。假设我们有以下目录结构:

├── cmd
│   ├── main2.go
│   └── resource2
│       ├── empty.go
│       └── example.txt
├── go.mod
├── main
├── main.go
├── main2
└── resource
    └── example.txt

3 directories, 8 files

在 main.go 中,如果我们想嵌入同级目录 resource 下的所有文件,可以使用以下代码:

//go:embed resource/*
var embeddedFiles embed.FS

注意,这里我们只需要提供相对路径 resource/*,因为 main.go 和 resource 目录位于同级。

现在,让我们看看如何读取嵌入的文件:

func main() {
    // 读取嵌入的文件
    fileData, err := embeddedFiles.ReadFile("resource/example.txt")
    if err != nil {
        panic(err)
    }

    // 将文件内容转换为字符串并打印出来
    fmt.Println(string(fileData))
}

如果我们想要嵌入 cmd/resource2 目录下的文件,由于它不是相对于 main.go 的同级目录,我们需要提供完整的相对路径:

//go:embed cmd/resource2/*
var embeddedFiles embed.FS

在 main2.go 中,由于它位于 cmd 目录下,因此可以直接使用相对路径 resource/* 来嵌入同级目录 resource2 下的文件。

//go:embed resource2/*
var embeddedFiles embed.FS

总的来说,embed.FS 的匹配规则简单明了,只需要记住从当前 Go 源文件所在的目录开始搜索即可。通过合理利用这个功能,您可以轻松地将静态资源文件嵌入到您的 Go 应用程序中,提高可移植性和安全性。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant