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.
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éeMyClass
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!