Rumah >pembangunan bahagian belakang >Golang >Adakah bahasa go serasi dengan bahasa c?

Adakah bahasa go serasi dengan bahasa c?

青灯夜游
青灯夜游asal
2022-12-26 10:23:045631semak imbas

Bahasa Go serasi dengan bahasa c; Bahasa Go boleh memanggil bahasa C dan juga boleh memanggil bahasa C. Terdapat arahan Cgo dalam toolkit bahasa Go, yang digunakan untuk mengendalikan operasi yang berkaitan dengan Go memanggil C dan fungsi Go boleh dieksport ke C, cuma tambah "//export funcname" di hadapan fungsi yang akan dieksport, dan maka anda boleh Gunakan perintah "go build -buildmode=c-shared -o libxxx.so" untuk menyusun dan menjana perpustakaan dinamik dan fail pengepala untuk digunakan dalam bahasa C.

Adakah bahasa go serasi dengan bahasa c?

Persekitaran pengendalian tutorial ini: sistem Windows 7, GO versi 1.18, komputer Dell G3.

Bahasa C dan golang adalah serasi. Fail .c yang anda tulis dalam C boleh dirujuk dengan golang dan digunakan secara langsung.

Banyak daripada pelbagai bahasa pengaturcaraan peringkat tinggi moden dibina di atas bahasa C Pada asasnya, mereka boleh memanggil bahasa C, dan ini juga diperlukan dan wujud dalam beberapa kes. maksudnya. Bahasa Go menyokong aspek ini dengan baik. Ia bukan sahaja boleh memanggil bahasa C, tetapi juga memanggil bahasa C. Artikel ini akan menerangkan kandungan yang berkaitan.

Penerangan asas

Terdapat arahan Cgo dalam kit alat bahasa Go, yang digunakan untuk mengendalikan operasi yang berkaitan dengan Go memanggil C. Kita boleh menggunakan arahan ini secara langsung atau memanggilnya secara automatik apabila menjalankan atau membina program Go.

Pemprosesan bahasa C Cgo itu sendiri bergantung pada rantai alat kompilasi berkaitan bahasa C dalam sistem, jadi anda perlu memberi perhatian kepada tetapan, terutamanya tetapan pembolehubah persekitaran Go:

Adakah bahasa go serasi dengan bahasa c?

Perhatian khusus harus diberikan kepada fakta bahawa Cgo perlu didayakan, yang boleh ditetapkan menggunakan perintah go env -w CGO_ENABLED=1. Dalam gambar di atas, anda boleh melihat beberapa parameter FLAGS semasa menyusun C. Anda boleh melaraskan tetapan sewajarnya jika perlu. Selain itu, CC CXX di atas adalah tetapan rantai alat penyusunan, yang juga boleh dilaraskan mengikut keperluan.

Memanggil C dalam Go

Memanggil bahasa C dalam Go akhirnya akan dipaparkan sebagai pakej pseudo bernama C dalam Go, Dalam Go, gunakan ulasan import "C" di atas baris #include ... untuk merujuk pustaka berkaitan bahasa C. Pembolehubah dan fungsi awam dalam perpustakaan yang dirujuk ini akan digantung ke dalam pakej C untuk digunakan dalam Go. Berikut ialah demonstrasi mudah:

Adakah bahasa go serasi dengan bahasa c?

Untuk memanggil C dalam Go, lakukan sahaja perkara di atas dan ia sangat mudah digunakan.

Secara umumnya, projek program bahasa C mungkin termasuk kod pemasangan sebagai tambahan kepada kod bahasa C atau projek itu mungkin juga pengaturcaraan campuran C/C++. Semua projek ini boleh digunakan dalam Go. Cgo akan mengenal pasti fail secara automatik dengan akhiran .c .s .S .sx .cc .cpp .cxx dan memanggil pengkompil yang sepadan untuk menyusunnya.

Perlu diambil perhatian bahawa sintaks yang tidak disokong oleh C, seperti terlebih muatan dan kaedah kelas dalam C++, perlu dibalut dengan lapisan fungsi standard bahasa C jika anda ingin menggunakannya dalam Go kaedah penggunaan adalah sama seperti memanggil C++ dalam bahasa C Sama. [Cadangan berkaitan: Pergi tutorial video, Pengajaran pengaturcaraan]

Memanggil Go in C

Jika anda menghadapi sebarang masalah dalam ujian berikut, anda boleh mencuba go clean untuk menetapkan semula projek sebelum meneruskan.

Fungsi Go boleh dieksport ke C. Cuma tambah //export funcname di hadapan fungsi yang hendak dieksport, kemudian anda boleh menggunakan perintah go build -buildmode=c-shared -o libxxx.so untuk menyusun dan menjana pustaka dinamik dan fail pengepala Bahasa C. Digunakan dalam:

Adakah bahasa go serasi dengan bahasa c?
Adakah bahasa go serasi dengan bahasa c?

Selain itu, anda juga boleh menggunakan go build -buildmode=c-archive -o libxxx.a untuk menyusun dan menjana perpustakaan statik yang boleh digunakan dalam C bahasa.

Perbezaan dalam jenis data

Panggilan antara dua bahasa sebenarnya adalah pemprosesan pemindahan data Perlu diingatkan bahawa kedua-duanya tidak sama selepas semua Bahasa jadi terdapat sekatan pada jenis data yang boleh berinteraksi antara keduanya. Kadangkala terdapat keperluan untuk memaksa penukaran jenis data, seperti kod berikut:

package rand

// #include <stdlib.h>
import "C"

func Random() int {
    return int(C.random()) // C函数返回值给Go,random的返回值是long类型
}

func Seed(i int) {
    C.srandom(C.uint(i)) // Go传值给C的函数,srandom函数接收uint类型数据
}

Penukaran jenis berangka asas yang tersedia antara kedua-duanya adalah seperti berikut:

C.char,       C.schar (signed char),       C.uchar (unsigned char)
C.short,       C.ushort (unsigned short)
C.int,       C.uint (unsigned int)
C.long,       C.ulong (unsigned long)
C.longlong (long long),       C.ulonglong (unsigned long long)
C.float,       C.double
C.complexfloat (complex float),       C.complexdouble (complex double)

Selain itu kepada jenis Asas di atas, penunjuk juga boleh dihantar. Khususnya, penunjuk void* dalam C adalah bersamaan dengan unsafe.Pointer dalam Go.

__int128_t dan __uint128_t dalam C adalah bersamaan dengan [16]byte dalam Go.

C中函数传输参数为数组的话直接传递数组名就行,在Go中向这类函数传递数组需要传递数组第一个元素的地址,另外需要注意的是数组中元素也必须是C语言中支持的类型:

C.f(&C.arr[0])

C中并没有string类型,使用字符串时需要进行处理:

package print

// #include <stdio.h>
// #include <stdlib.h>
import "C"
import "unsafe"

func Print(s string) {
    cs := C.CString(s) // 这个方式会将字符串拷贝一份,返回指针,注意使用完需要释放内存
    defer C.free(unsafe.Pointer(cs)) // defer修饰的语句会在该函数退出前执行
    C.fputs(cs, (*C.FILE)(C.stdout))
}

另外C语言的字符串 *C.char 可以使用 C.GoString() 转换成Go中的字符串。

C中的 struct union enum 这些类型在Go使用需要加上对应的前缀,变成 struct_xxx union_xxx enum_xxx 。其中联合体在Go中将成为字节数组的形式。这些对象的成员名如果和Go的关键词一样的话,在Go中使用需要在成员名前面加下划线,比如 x._name

C中的 sizeof 在Go中需要使用 C.sizeof_T 方式使用,T是变量数据类型。

更多编程相关知识,请访问:编程视频!!

Atas ialah kandungan terperinci Adakah bahasa go serasi dengan bahasa c?. 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