Maison > développement back-end > Golang > Comment puis-je intégrer des fichiers dans des binaires Go en utilisant « go:embed » et « go generate » ?

Comment puis-je intégrer des fichiers dans des binaires Go en utilisant « go:embed » et « go generate » ?

Susan Sarandon
Libérer: 2024-12-18 02:32:10
original
367 Les gens l'ont consulté

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

Intégration de fichiers dans des binaires Go

En programmation, il est courant de distribuer des fichiers exécutables qui nécessitent des ressources supplémentaires, tels que des fichiers texte. Pour simplifier le déploiement et éviter d'avoir à distribuer plusieurs fichiers, il est avantageux d'intégrer ces ressources dans le binaire lui-même.

Intégration de fichiers avec go:embed (Go 1.16 et versions ultérieures)

Avec Go 1.16, la directive go:embed fournit une méthode simple d'intégration 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))
}
Copier après la connexion

Intégration de fichiers avec go generate (avant Go 1.16)

Pour les versions antérieures de Go, go generate propose une approche alternative :

  1. Créez un script includetxt.go : Ce script lira les fichiers texte et générera une chaîne des littéraux pour eux.
  2. Ajoutez le commentaire go:generate à main.go : Le commentaire déclenchera l'exécution du script includetxt.go et générera les littéraux de chaîne.
  3. Exemple code :

    main.go

    package main
    
    import "fmt"
    
    //go:generate go run scripts/includetxt.go
    
    func main() {
        fmt.Println(a)
        fmt.Println(b)
    }
    Copier après la connexion

    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")
            }
        }
    }
    Copier après la connexion
  4. Compilation :

    $ go generate
    $ go build -o main
    Copier après la connexion

Supplémentaire Remarques :

  • L'approche go generate nécessite que les fichiers texte soient encodés en UTF-8.
  • Pour les fichiers non UTF-8, vous pouvez utiliser un encodage personnalisé dans le script includetxt.go.
  • Le type embed.FS dans go:embed permet d'accéder aux fichiers incorporés à l'aide d'un fichier virtuel système.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal