首页 > 后端开发 > Golang > 如何使用'go:embed”和'gogenerate”将文件嵌入到 Go 二进制文件中?

如何使用'go:embed”和'gogenerate”将文件嵌入到 Go 二进制文件中?

Susan Sarandon
发布: 2024-12-18 02:32:10
原创
371 人浏览过

How Can I Embed Files into Go Binaries Using `go:embed` and `go generate`?

将文件嵌入到 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 提供了另一种方法:

  1. 创建一个 includetxt.go 脚本:该脚本将读取文本
  2. 将 go:generate 注释添加到 main.go: 该注释将触发 includetxt.go 脚本的执行并生成字符串。
  3. 示例代码:

    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")
            }
        }
    }
    登录后复制
  4. 编译:

    $ go generate
    $ go build -o main
    登录后复制

额外注意:

  • go generated 方法要求文本文件采用 UTF-8 编码。
  • 对于非 UTF-8 文件,您可以在includetxt.go 脚本。
  • go:embed 中的 embed.FS 类型提供使用虚拟文件对嵌入文件的访问系统。

以上是如何使用'go:embed”和'gogenerate”将文件嵌入到 Go 二进制文件中?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板