Chargement dynamique d'un package dans Go
Il n'est généralement pas possible de charger un package spécifique pendant l'exécution dans Go. Le langage ne prend actuellement pas en charge les bibliothèques chargées dynamiquement, les packages doivent donc être compilés dans l'exécutable principal avant que le programme puisse s'exécuter.
Cependant, il existe des approches alternatives que vous pouvez envisager pour atteindre un objectif similaire :
Plugins en tant qu'exécutables
Une option consiste à créer des exécutables distincts pour chaque plugin, chacun avec la même interface mais différent mises en œuvre. Vous pouvez ensuite charger ces plugins selon vos besoins en les démarrant en tant que processus distincts et en communiquant avec eux via des sockets ou des entrées/sorties standard (stdin/stdout).
Plugins Go (depuis Go 1.8)
En 2017, Go a introduit la prise en charge des plugins. Les plugins vous permettent de charger et de décharger dynamiquement du code dans un programme en cours d'exécution. Cette fonctionnalité est actuellement prise en charge sur Linux et macOS.
Pour utiliser les plugins Go, vous devez créer une bibliothèque partagée (.so) qui contient le code du plugin et une fonction d'enregistrement. Vous pouvez ensuite charger le plugin dans votre programme à l'aide du package de plugin.
Voici un exemple de la façon de charger et d'utiliser un plugin dans Go :
package main import ( "fmt" "plugin" ) func main() { // Load the plugin library p, err := plugin.Open("my_plugin.so") if err != nil { panic(err) } // Get the registration function registerFunc, err := p.Lookup("Register") if err != nil { panic(err) } // Register the plugin's functions register := registerFunc.(func()) register() // Call a function from the plugin callFunc, err := p.Lookup("CallFunction") if err != nil { panic(err) } output, err := callFunc.(func()) if err != nil { panic(err) } fmt.Println(output) }
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!