Maison >développement back-end >Golang >Comment éliminer le code inutilisé des binaires Go au moment de la compilation ?

Comment éliminer le code inutilisé des binaires Go au moment de la compilation ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-29 08:47:11718parcourir

How to Eliminate Unused Code from Go Binaries at Compile Time?

Comment supprimer le code inutilisé au moment de la compilation dans Go ?

Lors de la création d'un package Go utilisé par plusieurs entités et importé à l'aide de la méthode standard, il est observé que tous les utilitaires , y compris les plus petits, génèrent de gros binaires au moment de la compilation. L'enquête sur le problème révèle que l'intégralité du package est compilée dans chaque utilitaire, même les fonctions qui ne sont pas utilisées.

Pour approfondir le problème, considérez ce qui suit code :

main.go :

package main

import "play/subplay"

func main() {
    subplay.A()
}

play/subplay.go :

package subplay

func A() {
    fmt.Printf("this is function A()")
}

func B() {
    fmt.Printf("secret string")
}

Malgré la fonction B() n'étant pas appelé, sa valeur de chaîne, "chaîne secrète", apparaît dans le binaire compilé main.exe. Ce comportement soulève la question de savoir comment éliminer le code inutilisé des programmes Go au moment de la compilation.

La réponse réside dans le fait que le compilateur Go gère déjà cette tâche. Lors du processus de compilation, le compilateur regroupe le code dans des fichiers d'archive (.a) et n'inclut que les composants essentiels dans le binaire exécutable. Il exclut les éléments identifiables comme inaccessibles.

Il est crucial de noter que si un package importé importe d'autres packages, ce processus de filtrage doit être appliqué de manière récursive. Par exemple, l'importation d'un package qui importe des packages supplémentaires entraînera également l'inclusion des packages dépendants.

Voici quelques exemples illustratifs :

Importation d'un package sans utiliser aucune fonctionnalité :

package main

import _ "play/subplay"

func main() {
}

Dans ce cas, le binaire résultant fera environ 1 Mo. Cependant, si le package importé importe net/http :

package subplay

import _ "net/http"

func A() {}

Et que vous n'utilisez toujours pas net/http dans votre code, la taille binaire augmentera considérablement jusqu'à environ 5 Mo en raison de l'importation net/http. 39 autres packages.

Et lorsque vous commencez à utiliser net/http mais que vous n'appelez pas subplay.A() dans le package principal, la taille de l'exécutable reste la pareil.

package subplay

import "net/http"

func A() {
    http.ListenAndServe("", nil)
}

Ce n'est que lorsque vous appelez subplay.A() à partir du package principal que la taille du binaire augmente encore :

package main

import "play/subplay"

func main() {
    subplay.A()
}

Ce qu'il faut retenir, c'est que le code inclus dans le binaire exécutable est directement influencé par les fonctions et modules que vous appelez à partir des packages importés.

De plus, il est essentiel de se rappeler que Go est un langage lié statiquement, ce qui signifie le binaire exécutable doit contenir tout ce dont il a besoin pour s'exécuter.

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!

Déclaration:
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