Maison  >  Article  >  développement back-end  >  Comment développer des plug-ins Golang

Comment développer des plug-ins Golang

王林
王林original
2023-05-10 16:31:071093parcourir

Avec la popularité du langage Go et l'expansion continue des scénarios d'application, de plus en plus d'entreprises et de développeurs commencent à adopter le langage Go pour le développement. Parmi eux, l’écriture de plug-ins Go est devenue un sujet brûlant. Le plug-in Go est un fichier binaire indépendant qui peut être chargé dans un programme Go au moment de l'exécution pour étendre le programme et améliorer ses fonctionnalités. Cet article explique comment développer des plug-ins Golang.

1. Comprendre le plug-in Go

Le plug-in Go est un mécanisme d'extension officiellement fourni par le langage Go. Il permet de charger dynamiquement des fichiers binaires pendant l'exécution du programme, étendant ainsi le programme et améliorant ses fonctionnalités. Les plug-ins Go peuvent être compilés indépendamment en binaires, puis chargés dynamiquement au moment de l'exécution sans compiler le code source. Les plugins Go contiennent généralement une ou plusieurs fonctions et autorisent uniquement les fonctions exportées.

2. Compilation de plug-ins

Les plug-ins Go peuvent être compilés comme les programmes Go ordinaires. Il vous suffit d'utiliser le paramètre -buildmode pour spécifier le mode du plug-in lors de la compilation. Par exemple : -buildmode参数指定插件模式即可。例如:

go build -buildmode=plugin plugin.so plugin.go

其中,plugin.so为输出的插件文件名,plugin.go为包含插件代码的Go源文件。编译成功后,将会生成一个独立的.so文件。

三、插件的导出函数

Go插件可以导出一个或多个函数,供主程序调用。导出函数的方法与普通函数相同,只需在函数前加上export关键字即可。

package main

import (
    "log"
)

// 普通函数
func Add(a, b int) int {
    return a + b
}

// 导出函数
// 必须符合如下形式:func 函数名(参数类型) 返回值类型
func ExportAdd(a, b int) int {
    log.Println("调用了插件函数ExportAdd")
    return Add(a, b)
}

注意:导出函数的命名规则是首字母大写,即可导出。

四、加载插件

Go程序可以通过plugin.Open函数加载插件,该函数返回一个*plugin.Plugin类型的结构,通过该结构可以调用插件中的导出函数。以下是使用plugin.Open函数加载并调用插件的示例代码:

package main

import (
    "log"
    "plugin"
)

func main() {
    // 加载插件
    p, err := plugin.Open("./plugin.so")
    if err != nil {
        log.Fatalf("打开插件失败:%v
", err)
    }

    // 查找插件中的导出函数
    add, err := p.Lookup("ExportAdd")
    if err != nil {
        log.Fatalf("查找导出函数失败:%v
", err)
    }

    // 调用导出函数
    result := add.(func(int, int) int)(1, 2)
    log.Println("Result: ", result)
}

五、注意事项

  1. 插件只支持Linux、macOS、FreeBSD和Windows操作系统。
  2. 插件必须在与主程序相同的架构下编译,即插件和主程序的操作系统、CPU架构必须一致,否则会导致无法加载插件。
  3. 在插件中使用的所有依赖都必须静态链接,否则会导致加载插件失败。
  4. Go插件的导出函数必须符合func 函数名(参数类型) 返回值类型rrreee
  5. Parmi eux, plugin.so est le nom du fichier de plug-in de sortie, et plugin.go est le fichier source Go contenant le code du plug-in. . Après une compilation réussie, un fichier .so indépendant sera généré.
  6. 3. Fonctions exportées du plug-in

Le plug-in Go peut exporter une ou plusieurs fonctions à appeler par le programme principal. La méthode d'export d'une fonction est la même que celle d'une fonction normale, il suffit d'ajouter le mot-clé export avant la fonction.

rrreee

Remarque : La règle de dénomination des fonctions exportées est de mettre la première lettre en majuscule, et elles peuvent être exportées.

🎜4. Chargement de plug-ins🎜🎜Le programme Go peut charger des plug-ins via la fonction plugin.Open, qui renvoie une structure de type *plugin.Plugin, via dont la structure peut être appelée Fonctions exportées dans les plugins. Voici un exemple de code qui utilise la fonction plugin.Open pour charger et appeler le plug-in : 🎜rrreee🎜 5. Notes 🎜
    🎜Le plug-in ne prend en charge que Linux, macOS, Systèmes d'exploitation FreeBSD et Windows. 🎜🎜Le plug-in doit être compilé sous la même architecture que le programme principal, c'est-à-dire que le système d'exploitation et l'architecture CPU du plug-in et du programme principal doivent être cohérents, sinon le plug-in ne sera pas chargé. 🎜🎜Toutes les dépendances utilisées dans le plug-in doivent être liées statiquement, sinon cela entraînera un échec de chargement du plug-in. 🎜🎜La fonction exportée du plug-in Go doit être conforme aux spécifications du nom de la fonction func (type de paramètre) type de valeur de retour, et la première lettre du nom de la fonction doit être en majuscule. 🎜🎜Les plug-ins Go sont des binaires compilés indépendamment, le code du plug-in doit donc être inclus dans le même package et ne peut pas s'étendre sur les fichiers de plusieurs packages. 🎜🎜🎜 6. Résumé 🎜🎜Le langage Go fournit un mécanisme de plug-in complet, et les développeurs peuvent réaliser une expansion dynamique et une amélioration fonctionnelle des programmes grâce à des plug-ins. Lors de l'écriture d'un plug-in Go, vous devez faire attention à des problèmes tels que le mode de compilation du plug-in, la convention de dénomination des fonctions exportées et la même architecture du plug-in et du programme principal. Grâce à l'introduction de cet article, je pense que tout le monde a une compréhension plus profonde du développement des plug-ins Go et que vous pouvez essayer d'écrire vos propres plug-ins Go pour obtenir des fonctions plus étendues. 🎜

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