Rumah > pembangunan bahagian belakang > Golang > Sambungan rangka kerja Golang saling beroperasi dengan kod asli

Sambungan rangka kerja Golang saling beroperasi dengan kod asli

PHPz
Lepaskan: 2024-06-05 14:23:01
asal
852 orang telah melayarinya

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.

Sambungan rangka kerja Golang saling beroperasi dengan kod asli

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!"))
}
Salin selepas log masuk

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"
Salin selepas log masuk

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))
}
Salin selepas log masuk

使用 SWIG 调用 C++ 类

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

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

然后我们可以用 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)
}
Salin selepas log masuk

Memanggil kelas C++ menggunakan SWIG

🎜🎜 Katakan kita mempunyai kelas C++ yang dipanggil MyClass 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!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan