Maison  >  Article  >  développement back-end  >  L'extension du framework Golang interagit avec le code natif

L'extension du framework Golang interagit avec le code natif

PHPz
PHPzoriginal
2024-06-05 14:23:01766parcourir

Le framework Go peut interagir avec le code natif via CGO et SWIG : CGO permet des appels directs aux fonctions C, générant des wrappers de conversion entre les paramètres Go et les types C. SWIG génère du code wrapper qui interface le code C/C++ avec le code Go, offrant ainsi une abstraction et une personnalisation de haut niveau.

Lextension du framework Golang interagit avec le code natif

Extension du framework Go pour interagir avec le code natif

Dans les applications Go, nous devons souvent interagir avec le code natif, comme appeler des bibliothèques C ou utiliser des appels système. Go propose deux mécanismes principaux pour y parvenir : CGO et SWIG.

CGO

CGO permet d'appeler des fonctions C directement depuis le code Go. Il fonctionne en utilisant le compilateur pour générer un wrapper qui convertit les paramètres Go en types C et appelle le code C.

import "C"

func main() {
    C.puts(C.CString("Hello from Go!"))
}

SWIG

SWIG (Simplified Wrapper and Interface Generator) est un outil qui peut générer du code wrapper qui interface automatiquement le code C/C++ avec le code Go. SWIG offre un niveau d'abstraction et de personnalisation plus élevé que CGO, mais nécessite une configuration supplémentaire.

swig -go -c++ mymodule.i
go build -ldflags=-extldflags="-static"

Cas pratique

Utilisez CGO pour appeler la bibliothèque C pour analyser JSON

Supposons que nous ayons une bibliothèque C nommée libjson, qui fournit la fonction d'analyse des chaînes JSON. Nous pouvons appeler cette bibliothèque en utilisant CGO : libjson 的 C 库,它提供了解析 JSON 字符串的功能。我们可以使用 CGO 调用这个库:

package main

/*
#cgo LDFLAGS: -ljson
#include <stdio.h>
#include <stdlib.h>
void parse_json(const char* json_string);
*/
import "C"

func main() {
    input := "{"foo":"bar"}"
    C.parse_json(C.CString(input))
}

使用 SWIG 调用 C++ 类

假设我们有一个名为 MyClass 的 C++ 类,它具有进行计算的成员函数。我们可以使用 SWIG 生成包装器代码:

// MyClass.h
class MyClass {
public:
    int compute(int a, int b);
};
modules MyModule {
    interface MyClass {
        function compute(a, b);
    };
};

然后我们可以用 Go 代码调用 MyClass

package main

// #cgo CFLAGS: -I../cpp
// #cgo LDFLAGS: -L../cpp -lMyModule
// #include "MyModule_wrap.h"
import "C"

func main() {
    obj := MyClass_new()
    defer MyClass_delete(obj)
    result := int(C.MyClass_compute(obj, 10, 20))
    println(result)
}

Appel d'une classe C++ à l'aide de SWIG

🎜🎜 Disons que nous avons une classe C++ appelée MyClass qui a des fonctions membres qui effectuent des calculs. Nous pouvons utiliser SWIG pour générer du code wrapper : 🎜rrreeerrreee🎜 Ensuite, nous pouvons appeler MyClass avec le code Go : 🎜rrreee🎜 En utilisant CGO ou SWIG, nous pouvons facilement intégrer du code natif aux applications Go, étendant ainsi la fonctionnalité du framework et interaction avec le système sous-jacent. 🎜

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