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)) }
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();
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") }
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; }
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 build
Kompilkan 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.