Rangka kerja Go boleh berinteraksi dengan kod asli melalui CGO dan SWIG: CGO membenarkan panggilan terus ke fungsi C, menjana pembalut penukaran antara parameter Go dan jenis C. SWIG menjana kod pembalut yang menghubungkan kod C/C++ dengan kod Go, memberikan abstraksi dan penyesuaian peringkat tinggi.
Go sambungan rangka kerja untuk saling beroperasi dengan kod asli
Dalam aplikasi Go, kita selalunya perlu berinteraksi dengan kod asli, seperti memanggil perpustakaan C atau menggunakan panggilan sistem. Go menyediakan dua mekanisme utama untuk mencapai ini: CGO dan SWIG.
CGO
CGO membenarkan memanggil fungsi C terus daripada kod Go. Ia berfungsi dengan menggunakan pengkompil untuk menghasilkan pembungkus yang menukar parameter Go kepada jenis C dan memanggil kod C.
import "C" func main() { C.puts(C.CString("Hello from Go!")) }
SWIG
SWIG (Simplified Wrapper and Interface Generator) ialah alat yang boleh menjana kod pembalut yang secara automatik antara muka kod C/C++ dengan kod Go. SWIG menyediakan tahap abstraksi dan penyesuaian yang lebih tinggi daripada CGO, tetapi ia memerlukan persediaan tambahan.
swig -go -c++ mymodule.i go build -ldflags=-extldflags="-static"
Kes praktikal
Gunakan CGO untuk memanggil perpustakaan C untuk menghuraikan JSON
Andaikan kita mempunyai perpustakaan C bernama libjson
, yang menyediakan fungsi menghuraikan rentetan JSON. Kita boleh memanggil perpustakaan ini menggunakan 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) }
Memanggil kelas C++ menggunakan SWIG
🎜🎜 Katakan kita mempunyai kelas C++ yang dipanggilMyClass
yang mempunyai fungsi ahli yang melakukan pengiraan. Kita boleh menggunakan SWIG untuk menjana kod pembalut: 🎜rrreeerrreee🎜 Kemudian kita boleh memanggil MyClass
dengan kod Go: 🎜rrreee🎜 Dengan menggunakan CGO atau SWIG, kami boleh dengan mudah menyepadukan kod asli dengan aplikasi Go, Dengan itu memanjangkan kefungsian rangka kerja dan berinteraksi dengan sistem asas. 🎜Atas ialah kandungan terperinci Sambungan rangka kerja Golang saling beroperasi dengan kod asli. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!