ホームページ >バックエンド開発 >Golang >「go:embed」と「gogenerate」を使用して静的ファイルを Go バイナリに埋め込むにはどうすればよいですか?

「go:embed」と「gogenerate」を使用して静的ファイルを Go バイナリに埋め込むにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-25 10:21:17807ブラウズ

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

これはコンテンツを埋め込みます

go generated の使用

Go の古いバージョンの場合は、スクリプトと組み合わせて go generated を使用してファイルを埋め込むことができます。以下に例を示します:

ファイル構造:

  • main.go
  • scripts/includetxt.go (埋め込みscript)
  • a.txt
  • b.txt

メイン。 go:

//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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。