>백엔드 개발 >Golang >`go:embed` 및 `go generate`를 사용하여 Go 바이너리에 정적 파일을 어떻게 포함할 수 있나요?

`go:embed` 및 `go generate`를 사용하여 Go 바이너리에 정적 파일을 어떻게 포함할 수 있나요?

DDD
DDD원래의
2024-12-25 10:21:17808검색

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

Go 바이너리에 정적 파일 포함

Go 바이너리에 정적 파일을 포함하면 필요한 모든 파일이 실행 파일 내에 번들로 포함되어 외부 파일 관리가 필요하지 않게 됩니다. 이는 go:embed 지시문 또는 go generate 기술을 통해 달성할 수 있습니다.

go:embed 지시문(Go 1.16) 사용

Go 1.16부터 go:embed 지시문을 사용할 수 있습니다. 파일을 바이너리에 직접 포함하려면:

//go:embed hello.txt
var s string

이렇게 하면 다음 내용이 포함됩니다. hello.txt를 문자열 변수 s에 추가합니다.

go generate 사용

이전 버전의 Go에서는 스크립트와 함께 go generate를 사용하여 파일을 삽입할 수 있습니다. 예는 다음과 같습니다.

파일 구조:

  • main.go
  • scripts/includetxt.go(포함 스크립트)
  • a.txt
  • b.txt

main. 이동:

//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` 및 `go generate`를 사용하여 Go 바이너리에 정적 파일을 어떻게 포함할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.