Heim > Backend-Entwicklung > Golang > Wie kann ich Dateien mit „go:embed' und „go generic' in Go-Binärdateien einbetten?

Wie kann ich Dateien mit „go:embed' und „go generic' in Go-Binärdateien einbetten?

Susan Sarandon
Freigeben: 2024-12-18 02:32:10
Original
367 Leute haben es durchsucht

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

Einbetten von Dateien in Go-Binärdateien

In der Programmierung ist es üblich, ausführbare Dateien zu verteilen, die zusätzliche Ressourcen erfordern, wie z. B. Textdateien. Um die Bereitstellung zu vereinfachen und die Verteilung mehrerer Dateien zu vermeiden, ist es vorteilhaft, diese Ressourcen in die Binärdatei selbst einzubetten.

Einbetten von Dateien mit go:embed (Go 1.16 und höher)

Mit Go 1.16 bietet die go:embed-Direktive eine unkomplizierte Methode zum Einbetten Dateien:

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))
}
Nach dem Login kopieren

Einbetten von Dateien mit go generate (vor Go 1.16)

Für frühere Versionen von Go bietet go generate einen alternativen Ansatz:

  1. Erstellen Sie ein includetxt.go-Skript: Dieses Skript liest die Textdateien und Generieren Sie String-Literale für sie.
  2. Fügen Sie den go:generate-Kommentar zu main.go hinzu: Der Kommentar löst die Ausführung des includetxt.go-Skripts aus und generiert die String-Literale.
  3. Beispiel Code:

    main.go

    package main
    
    import "fmt"
    
    //go:generate go run scripts/includetxt.go
    
    func main() {
        fmt.Println(a)
        fmt.Println(b)
    }
    Nach dem Login kopieren

    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")
            }
        }
    }
    Nach dem Login kopieren
  4. Zusammenstellung:

    $ go generate
    $ go build -o main
    Nach dem Login kopieren

Zusätzlich Hinweise:

  • Der Go-Generate-Ansatz erfordert, dass die Textdateien UTF-8-kodiert sind.
  • Für Nicht-UTF-8-Dateien können Sie eine benutzerdefinierte Kodierung in verwenden includetxt.go-Skript.
  • Der Typ „embed.FS“ in go:embed ermöglicht den Zugriff auf die eingebetteten Dateien über eine virtuelle Datei System.

Das obige ist der detaillierte Inhalt vonWie kann ich Dateien mit „go:embed' und „go generic' in Go-Binärdateien einbetten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage