Maison > Article > développement back-end > c Comment appeler Golang
Le langage C et Golang sont tous deux des langages de programmation couramment utilisés. Bien qu'ils soient différents dans leur syntaxe et leurs scénarios d'application, ils ont tous deux leurs propres avantages et inconvénients, de sorte que différents langages de programmation seront sélectionnés pour différentes exigences d'application. Mais si nous voulons intégrer le langage C et Golang, nous devons comprendre comment parvenir à l’interopérabilité entre les deux langages.
Cet article expliquera comment appeler le programme Golang en langage C. Le langage C est l'un des premiers langages de programmation et est largement utilisé dans le développement de systèmes, tandis que Golang est un langage de programmation plus récent, apprécié pour ses performances de concurrence efficaces. Intégrer les deux permet de prendre en compte leurs avantages respectifs et de mettre en œuvre des applications aux fonctionnalités plus riches.
Prérequis
Avant de commencer à essayer d'appeler Golang en langage C, nous devons nous assurer que Golang a été installé dans l'environnement. Vous pouvez saisir la commande suivante dans le terminal pour vérifier :
$ go version
Si les informations sur la version de Golang peuvent être affichées dans le terminal, cela signifie que l'installation a réussi.
Fonctions Calling Go
Golang fournit une API compatible avec le langage C, qui peut être utilisée directement dans les programmes C. Nous pouvons utiliser cette API pour appeler une fonction Golang depuis un programme C. Voici les étapes :
//export
avant le nom de la fonction. Cela expose l'interface fonctionnelle du programme C. package main import "C" //export Add func Add(x, y int) int { return x + y }
//export
。这样可以将函数接口暴露给C程序。typedef struct { uintptr_t p; } GoInt; typedef struct { uintptr_t p; int n; } GoString; typedef struct { uintptr_t p; int n; } GoSlice; typedef struct { uintptr_t p; uintptr_t len; uintptr_t cap; } GoSliceHeader; typedef struct { uintptr_t p; uintptr_t len; } GoStringHeader; typedef struct { uintptr_t p; int argc; void *argv; } GoArgs; typedef struct { uintptr_t p; int type; /* 0 = panic, 1 = error */ char *message; } GoError; typedef int (*AddFunc)(int, int); AddFunc NewAddFunc() { static GoInt Add; static int once = 1; if (once) { once = 0; // Call the "Add" function implemented in Go const char* name = "Add"; void* symbol = dlsym(RTLD_DEFAULT, name); if (symbol == NULL) { return NULL; } Add.p = (uintptr_t)symbol; } return (AddFunc)Add.p; }
在这个例子中,我们定义了一个Add
函数,接受两个整数并返回它们的和。通过//export
命令,我们将这个函数的接口暴露给了C程序。
int main() { AddFunc add = NewAddFunc(); if (add == NULL) { printf("Failed to find 'Add' function. "); return -1; } int result = add(1, 2); printf("The result is %d. ", result); return 0; }
Add
了。$ gcc -o cgo_example cgo_example.c -Wl,-rpath,$GOPATH/src/github.com/YourUserName/YourProjectName
在这个例子中,我们定义了NewAddFunc
来获取Add
函数的函数指针。如果没有成功获取到函数指针,则输出一条错误信息,并退出程序。如果获取到了函数指针,则我们可以直接通过它来调用Add
函数,输入两个整数参数,并通过printf
Dans cet exemple, nous définissons une fonction Add
qui accepte deux entiers et renvoie leur somme. Grâce à la commande //export
, nous exposons l'interface de cette fonction au programme C.
Ensuite, nous devons définir un pointeur de fonction dans le programme C pour enregistrer le handle lorsque nous appelons la fonction Golang.
Add
. Dans cet exemple, nous définissons NewAddFunc
pour obtenir le pointeur de fonction de la fonction Add
. Si le pointeur de fonction n'est pas obtenu avec succès, un message d'erreur est généré et le programme se termine. Si le pointeur de fonction est obtenu, nous pouvons appeler directement la fonction Add
via celui-ci, saisir deux paramètres entiers et sortir le résultat du calcul via la fonction printf
.
Remarque : Avant de compiler, vous devez ajouter les paramètres suivants à la ligne de commande pour vous assurer que le programme compilé peut lier correctement la bibliothèque Golang :
rrreee🎜Conclusion🎜🎜Grâce aux étapes ci-dessus, nous pouvons facilement l'appeler en C programmez la fonction Golang, réalisant ainsi des fonctions difficiles à réaliser dans les programmes C originaux. Dans le même temps, nous avons également vu que lors de l'exécution de ce processus, nous devons définir des pointeurs de fonction et des structures de données pour garantir le transfert correct des données et la correspondance correcte des types. Dans les applications pratiques, nous devons l'ajuster et le modifier de manière flexible en fonction de la situation réelle. 🎜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!