首頁 > 後端開發 > Golang > 如何使用「go:embed」和「gogenerate」將檔案嵌入 Go 二進位檔案中?

如何使用「go:embed」和「gogenerate」將檔案嵌入 Go 二進位檔案中?

Susan Sarandon
發布: 2024-12-18 02:32:10
原創
373 人瀏覽過

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. 建立一個includetxtgo 腳本:此腳本將讀取文字
  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)
    }
    登入後複製

    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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板