Maison  >  Article  >  développement back-end  >  c Comment appeler Golang

c Comment appeler Golang

WBOY
WBOYoriginal
2023-05-13 11:27:38788parcourir

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 :

  1. Tout d'abord, lors de la définition d'une fonction Golang, vous devez ajouter //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程序。

  1. 接下来,我们需要在C程序中定义一个函数指针,用于保存我们调用Golang函数时的句柄。
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;
}
  1. 现在我们就可以利用函数指针调用Golang函数Add了。
$ gcc -o cgo_example cgo_example.c -Wl,-rpath,$GOPATH/src/github.com/YourUserName/YourProjectName

在这个例子中,我们定义了NewAddFunc来获取Add函数的函数指针。如果没有成功获取到函数指针,则输出一条错误信息,并退出程序。如果获取到了函数指针,则我们可以直接通过它来调用Add函数,输入两个整数参数,并通过printfDans 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.

rrreee
    Nous pouvons maintenant utiliser le pointeur de fonction pour appeler la fonction Golang Add.
rrreee

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!

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