将文件嵌入到 Go 二进制文件中
在编程中,分发需要额外资源的可执行文件(例如文本文件)是很常见的。为了简化部署并避免分发多个文件,将这些资源嵌入到二进制文件本身是有益的。
使用 go:embed 嵌入文件(Go 1.16 及更高版本)
在 Go 1.16 中,go:embed 指令提供了一种简单的嵌入方法files:
package main import "embed" // Embed the "hello.txt" file as a string //go:embed hello.txt var s string // Embed the "hello.txt" file as a byte slice //go:embed hello.txt var b []byte // Embed the "hello.txt" file as an embed.FS object //go:embed hello.txt var f embed.FS func main() { // Read the file contents as a string data, _ := f.ReadFile("hello.txt") println(string(data)) }
使用 gogenerate 嵌入文件(Go 1.16 之前)
对于早期版本的 Go,gogenerate 提供了另一种方法:
示例代码:
main.go
package main import "fmt" //go:generate go run scripts/includetxt.go func main() { fmt.Println(a) fmt.Println(b) }
scripts/includetxt.go
package main import ( "io" "io/ioutil" "os" "strings" ) // Embed all .txt files as string literals func main() { fs, _ := ioutil.ReadDir(".") out, _ := os.Create("textfiles.go") for _, f := range fs { if strings.HasSuffix(f.Name(), ".txt") { out.WriteString(strings.TrimSuffix(f.Name(), ".txt") + " = `") f, _ := os.Open(f.Name()) io.Copy(out, f) out.WriteString("`\n") } } }
编译:
$ go generate $ go build -o main
额外注意:
以上是如何使用'go:embed”和'gogenerate”将文件嵌入到 Go 二进制文件中?的详细内容。更多信息请关注PHP中文网其他相关文章!