Rumah  >  Artikel  >  pembangunan bahagian belakang  >  c Cara memanggil golang

c Cara memanggil golang

WBOY
WBOYasal
2023-05-13 11:27:38748semak imbas

Bahasa C dan Golang adalah kedua-dua bahasa pengaturcaraan yang biasa digunakan Walaupun ia berbeza dari segi sintaks dan senario aplikasi, kedua-duanya mempunyai kelebihan dan kelemahan tersendiri, jadi bahasa pengaturcaraan yang berbeza akan dipilih untuk keperluan aplikasi yang berbeza. Tetapi jika kita ingin mengintegrasikan bahasa C dan Golang, kita perlu memahami bagaimana untuk mencapai kesalingoperasian antara kedua-dua bahasa.

Artikel ini akan memperkenalkan cara memanggil program Golang dalam bahasa C. Bahasa C ialah bahasa pengaturcaraan awal dan digunakan secara meluas dalam pembangunan sistem, manakala Golang ialah bahasa pengaturcaraan yang lebih baharu yang digemari untuk prestasi konkurensi yang cekap. Penyepaduan kedua-duanya membolehkan kami mengambil kira kelebihan masing-masing dan melaksanakan aplikasi dengan fungsi yang lebih kaya.

Prasyarat

Sebelum kita mula cuba memanggil Golang dalam bahasa C, kita mesti memastikan bahawa Golang telah dipasang di persekitaran. Anda boleh memasukkan arahan berikut dalam terminal untuk menyemak:

$ go version

Jika maklumat versi Golang boleh dikeluarkan dalam terminal, ini bermakna pemasangan telah berjaya.

Fungsi Memanggil Go

Golang menyediakan API serasi bahasa C, yang boleh digunakan terus dalam program C. Kita boleh menggunakan API ini untuk memanggil fungsi Golang daripada program C. Berikut ialah langkah-langkahnya:

  1. Pertama, apabila mentakrifkan fungsi Golang, anda perlu menambah //export sebelum nama fungsi. Ini mendedahkan antara muka berfungsi kepada program C.
package main

import "C"

//export Add
func Add(x, y int) int {
    return x + y
}

Dalam contoh ini, kami mentakrifkan fungsi Add yang menerima dua integer dan mengembalikan jumlahnya. Melalui arahan //export, kami mendedahkan antara muka fungsi ini kepada program C.

  1. Seterusnya, kita perlu menentukan penunjuk fungsi dalam program C untuk menyimpan pemegang apabila kita memanggil fungsi Golang.
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;
}
  1. Kini kita boleh menggunakan penuding fungsi untuk memanggil fungsi Golang Add.
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;
}

Dalam contoh ini, kami mentakrifkan NewAddFunc untuk mendapatkan penuding fungsi bagi fungsi Add. Jika penuding fungsi tidak berjaya diperoleh, mesej ralat akan dikeluarkan dan program akan keluar. Jika penuding fungsi diperoleh, kita boleh memanggil terus fungsi Add melaluinya, masukkan dua parameter integer, dan keluarkan hasil pengiraan melalui fungsi printf.

Nota: Sebelum menyusun, anda perlu menambah parameter berikut pada baris arahan untuk memastikan program yang disusun boleh memaut dengan betul ke perpustakaan Golang:

$ gcc -o cgo_example cgo_example.c -Wl,-rpath,$GOPATH/src/github.com/YourUserName/YourProjectName

Kesimpulan

Melalui Langkah-langkah di atas, kita boleh dengan mudah memanggil fungsi Golang dalam program C, dengan itu merealisasikan fungsi yang sukar dicapai dalam program C asal. Pada masa yang sama, kami juga telah melihat bahawa semasa melaksanakan proses ini, kami perlu menentukan penunjuk fungsi dan struktur data untuk memastikan pemindahan data yang betul dan padanan jenis yang betul. Dalam aplikasi praktikal, kita perlu menyesuaikan dan mengubah suai secara fleksibel mengikut situasi sebenar.

Atas ialah kandungan terperinci c Cara memanggil golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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
Artikel sebelumnya:Apakah kerangka golang?Artikel seterusnya:Apakah kerangka golang?