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

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

DDD
DDD原創
2024-12-25 10:21:17815瀏覽

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

將靜態檔案嵌入Go 二進位檔案

將靜態檔案嵌入Go 二進位檔案中可確保所有必要的檔案都捆綁在可執行檔案中,從而無需進行外部文件管理。這可以透過 go:embed 指令或 go generated 技術來實現。

使用go:embed 指令(Go 1.16 )

從Go 1.16 開始,可以使用go:embed 指令將檔案直接嵌入到二進位檔案中:

//go:embed hello.txt
var s string

這會嵌入以下內容hello.txt 到字串變數s 中。

使用 gogenerate

對於舊版的 Go,您可以使用 gogenerate 結合腳本來嵌入檔案。這是一個範例:

檔案結構:

  • main.go
  • script s/includetxt.go(嵌入腳本)
  • a.txt
  • b.txt

main.txt去:

//go:generate go run scripts/includetxt.go
package main

import "fmt"

func main() {
    fmt.Println(a)
    fmt.Println(b)
}

includetxt.go:

package main

import (
    "io/ioutil"
    "os"
    "strings"
)

func main() {
    // Create the output file
    out, _ := os.Create("textfiles.go")
    out.Write([]byte("package main \n\nconst (\n"))

    // Iterate over .txt files in the current directory
    fs, _ := ioutil.ReadDir(".")
    for _, f := range fs {
        if strings.HasSuffix(f.Name(), ".txt") {
            // Write the embedded file contents to the output file
            out.Write([]byte(strings.TrimSuffix(f.Name(), ".txt") + ` = "`))
            f, _ := os.Open(f.Name())
            io.Copy(out, f)
            out.Write([]byte("`\n"))
        }
    }
    // Close the output file
    out.Write([]byte(")\n"))
}

到嵌入檔案:

$ go generate
$ go build -o main

textfiles.go(產生):

package main 

const (
a = `hello`
b = `world`
)

這會將a.txt 和 b.txt 的內容嵌入到二進位檔案中作為字串常數,允許它們在 main.go 中分別以 a 和 b 存取。

以上是如何使用「go:embed」和「gogenerate」將靜態檔案嵌入 Go 二進位檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn