Rumah > pembangunan bahagian belakang > Golang > Perkongsian pengalaman: Betapa golang dan bahasa c memanggil satu sama lain!

Perkongsian pengalaman: Betapa golang dan bahasa c memanggil satu sama lain!

藏色散人
Lepaskan: 2021-11-25 14:55:35
ke hadapan
4366 orang telah melayarinya

Artikel ini diperkenalkan oleh ruangan tutorial go language untuk memperkenalkan cara golang dan bahasa c memanggil antara satu sama lain. Semoga dapat membantu rakan-rakan yang memerlukan.

Panggilan bersama antara bahasa go dan bahasa c

Baru-baru ini atas sebab kerja, adalah perlu untuk melaksanakan panggilan bersama antara bahasa go dan bahasa c. Memandangkan bahasa Go dan bahasa C adalah berkait rapat, panggilan antara keduanya boleh direalisasikan melalui tahap bahasa. Di bawah adalah ringkasan tentang ini.

go language calls c language

Berikut ialah contoh ringkas:

package main

// #include <stdio.h>
// #include <stdlib.h>
/*
void print(char *str) {
    printf("%s\n", str);
}
*/
import "C"

import "unsafe"

func main() {
    s := "Hello Cgo"
    cs := C.CString(s)
    C.print(cs)
    C.free(unsafe.pointer(cs))
}
Salin selepas log masuk

Berbanding dengan kod go "biasa", kod di atas mempunyai beberapa "ciri khas" ” tempat:

  • Dalam ulasan pembukaan, perkataan sertakan fail pengepala bahasa c muncul

  • Fungsi bahasa c ditakrifkan dalam cetakan komen

  • Mengimport "pakej" bernama C

  • Fungsi bahasa c yang ditakrifkan di atas dipanggil dalam cetakan fungsi utama

Pertama sekali, kod bahasa C dalam fail sumber go perlu dibalut dengan ulasan, sama seperti fail pengepala dan definisi fungsi cetak di atas, kedua, pernyataan import "C" diperlukan , dan ia tidak boleh dipisahkan oleh baris kosong daripada kod C di atas, dan mesti bersambung rapat. "C" di sini bukan nama pakej, tetapi konsep yang serupa dengan ruang nama, atau ia boleh difahami sebagai pakej pseudo Semua elemen sintaks bahasa C berada di bawah pakej pseudo ini, akhirnya, apabila mengakses sintaks c elemen, ia mesti berada di hadapannya Tambah awalan pakej pseudo, seperti C.uint dan C.print, C.free, dsb. dalam kod di atas.

Untuk penggunaan yang lebih terperinci bagi memanggil bahasa c dalam go, sila rujuk kesaling kendalian antara bahasa Go dan C Artikel ini tidak akan diperincikan satu demi satu.

Dalam contoh di atas, bahasa C dibenamkan dalam kod go Jika kod itu lebih besar dan lebih kompleks, ini jelas sangat tidak profesional. Jadi, bolehkah kod bahasa C dipisahkan daripada kod Go dan ditakrifkan secara berasingan? Jawapannya ya, ia boleh dicapai melalui perpustakaan kongsi.

cgo menyediakan arahan #cgo untuk menentukan perpustakaan kongsi yang mana kod sumber go akan dipautkan selepas penyusunan. Contohnya adalah seperti berikut:

// hello.go
package main

// #cgo LDFLAGS: -L ./ -lhello
// #include <stdio.h>
// #include <stdlib.h>
// #include "hello.h"
import "C"

func main() {
    C.hello()
}

// hello.c
#include "hello.h"

void hello()
{
    printf("hello, go\n");
}

// hello.h
extern void hello();
Salin selepas log masuk

Dalam hello.go, tambah #cgo selepas penunjuk LDFLAGS: -L ./ -lhello, yang menentukan untuk mencari perpustakaan so dalam direktori semasa dan memautkannya apabila kod go disusun.

Oleh itu, anda hanya perlu menyusun hello.c ke dalam pustaka dinamik, dan kemudian menyusun kod go, dan anda boleh memanggil fungsi bahasa c dalam pustaka kongsi apabila menjalankan kod go. Arahannya adalah seperti berikut:

  • gcc -fPIC -o libhello.so hello.c

  • go build -o hello

  • ./hello

Bahasa C memanggil bahasa go

Berbanding dengan memanggil kod sumber c dalam go, terdapat lebih sedikit kesempatan untuk menggunakan fungsi go dalam c. Kerana secara umumnya, menggunakan bahasa peringkat tinggi sebagai gam untuk memanggil bahasa peringkat rendah boleh memberikan permainan penuh kepada ciri masing-masing, manakala menggunakan bahasa peringkat rendah untuk memanggil bahasa peringkat tinggi boleh mengurangkan kelebihan prestasi bahasa peringkat rendah Dalam go, anda boleh menggunakan "nama fungsi eksport" Untuk mengeksport fungsi go untuk digunakan oleh kod c, lihat contoh mudah:

// hello.go
package main

import "C"

import "fmt"

// export Go2C
func Go2C() {
    fmt.Println("hello, C")
}
Salin selepas log masuk

Anda boleh menggunakan go build pilihan kompilasi untuk menyusun kod go ke dalam pustaka kongsi untuk kod c dipanggil. Ambil perhatian bahawa fungsi utama dan utama mesti wujud semasa menyusun perpustakaan jadi (walaupun fungsi utama kosong). Arahan kompilasi adalah seperti berikut: go build -v -x -buildmode=c-shared -o libhello.so hello.go.

Selepas penyusunan berjaya, anda hanya perlu memperkenalkan fail pengepala yang baru dijana ke dalam kod c dan memautkan perpustakaan dinamik semasa penyusunan untuk merealisasikan panggilan fungsi go. Kodnya adalah seperti berikut:

// hello.c
#include <stdio.h>
#include "libhello.h"

int main()
{
    Go2C();
    return 0;
}
Salin selepas log masuk

Pass gcc -o hello -L. -lhello untuk menyusunnya ke dalam atur cara boleh laku. Ambil perhatian bahawa sebelum menjalankan, anda mesti memastikan bahawa terdapat perpustakaan kongsi yang perlu dipautkan dalam laluan carian masa jalan perpustakaan kongsi Anda boleh meletakkan laluan perpustakaan jadi dalam /usr/lib atau mengubah suai pembolehubah persekitaran LD_LIBRARY_PATH.

Ringkasan

bahasa go boleh memanggil bahasa c dengan membenamkan kod c, atau dengan memanggil fungsi pustaka kongsi c, ia boleh dipanggil melalui go buildKompilkan kod go ke dalam perpustakaan kongsi untuk digunakan oleh kod c. Ambil perhatian bahawa perpustakaan kongsi dalam artikel ini adalah semua perpustakaan kongsi dinamik Bagi perpustakaan kongsi statik, mereka yang berminat boleh melaksanakannya.

Atas ialah kandungan terperinci Perkongsian pengalaman: Betapa golang dan bahasa c memanggil satu sama lain!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:segmentfault.com
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