Maison >développement back-end >Golang >Comment éliminer le code inutilisé des binaires Go au moment de la compilation ?
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!