在 Go 中,您可能会遇到希望将文件包含在已编译的可执行文件中而不是单独分发的情况。本指南探讨了在 Go 二进制文件中嵌入文件的两种方法:使用 go:embed 指令和 gogenerate 命令。
在 Go 1.16 中引入,go: embed 指令提供了一种将文件嵌入到二进制文件中的简单方法。该指令允许您直接定义一个变量,该变量将嵌入文件保存为字符串、字节片或 embed.FS 类型。例如:
import "embed" //go:embed hello.txt var s string
使用 go:embed 简化了嵌入文件的过程,尤其是在处理多个或动态生成的文件时。
在 Go 1.16 之前,gogenerate 命令提供了另一种嵌入文件的方法。此方法涉及创建一个自定义脚本,该脚本读取文件并生成一个包含嵌入文件作为字符串文字的 Go 文件。
创建一个脚本来生成 Go 文件:
在单独的脚本文件中,读取文本文件并将它们作为字符串文字写入新文件中。例如:
package main import ( "fmt" "io/ioutil" "os" "strings" ) // Reads all .txt files in the current folder // and encodes them as string literals in textfiles.go func main() { fs, _ := ioutil.ReadDir(".") out, _ := os.Create("textfiles.go") out.Write([]byte("package main \n\nconst (\n")) for _, f := range fs { if strings.HasSuffix(f.Name(), ".txt") { out.Write([]byte(strings.TrimSuffix(f.Name(), ".txt") + " = `")) f, _ := os.Open(f.Name()) io.Copy(out, f) out.Write([]byte("`\n")) } } out.Write([]byte(")\n")) }
在您的主 Go 文件中添加特殊注释:
在您的主 Go 中添加包含 gogenerate 命令的特殊注释文件。该注释告诉Go在编译之前运行指定的脚本。
//go:generate go run scripts/includetxt.go
虽然 go generated 提供了更大的灵活性,但 go:embed 是一种更现代、更方便的在 Go 二进制文件中嵌入文件的方法。选择最适合您的开发需求的方法。
以上是如何使用'go:embed”和'gogenerate”将文件嵌入到我的 Go 二进制文件中?的详细内容。更多信息请关注PHP中文网其他相关文章!