ホームページ  >  記事  >  バックエンド開発  >  Go言語はC言語と互換性がありますか?

Go言語はC言語と互換性がありますか?

青灯夜游
青灯夜游オリジナル
2022-12-26 10:23:045469ブラウズ

Go 言語は C 言語と互換性があり、Go 言語は C 言語を呼び出すことができ、また C 言語を呼び出すこともできます。 Go 言語ツールキットには Cgo コマンドがあり、これは C を呼び出す Go に関連する操作を処理するために使用されます。Go 関数は C にエクスポートでき、エクスポートする関数の前に「//export funcname」を追加するだけです。その後、「go build -buildmode=c-shared -o libxxx.so」コマンドを使用して、C 言語で使用するダイナミック ライブラリとヘッダー ファイルをコンパイルおよび生成できます。

Go言語はC言語と互換性がありますか?

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

C言語とgolangは互換性があります。 C で作成した .c ファイルは、golang で参照して直接使用できます。

現代の高級プログラミング言語の多くはC言語をベースに構築されており、基本的にはC言語を呼び出すことができますが、これも必要で存在する場合があります。 。 Go 言語はこの点を非常によくサポートしており、C 言語だけでなく C 言語も呼び出すことができます。この記事では関連する内容を解説していきます。

基本的な説明

Go 言語ツールキットには Cgo コマンドがあり、Go による C の呼び出しに関連する操作を処理するために使用されます。このコマンドは直接使用することも、Go プログラムの実行時または構築時に自動的に呼び出すこともできます。

Cgo による C 言語の処理自体は、システム内の C 言語関連のコンパイル ツール チェーンに依存しているため、設定、主に Go 環境変数の設定に注意する必要があります。

Go言語はC言語と互換性がありますか?

Cgo を有効にする必要があることに特に注意してください。これは、go env -w CGO_ENABLED=1 コマンドを使用して設定できます。上の図では、C コンパイル中にいくつかの FLAGS パラメータが表示されます。必要に応じて、設定を調整できます。また、上記の CC CXX はコンパイル ツール チェーンの設定であり、必要に応じて調整することもできます。

Go での C の呼び出し

Go での C 言語の呼び出しは、最終的に Go では C という名前の疑似パッケージとして表示されます。 , Go では、#import "C" 行の上にあるコメント #include ... を使用して、C 言語関連のライブラリを参照します。 これらの参照ライブラリ内のパブリック変数と関数は、Go で使用するために C パッケージにハングされます。以下は簡単なデモです:

Go言語はC言語と互換性がありますか?

Go で C を呼び出すには、上記の操作を行うだけで、非常に便利です。

一般に、C 言語プログラム プロジェクトには、C 言語コードに加えてアセンブリ コードが含まれる場合や、C/C 混合プログラミングの場合もあります。これらのプロジェクトは Go で使用でき、Cgo はサフィックスを .c .s .S .sx として自動的に認識します。 .cc .cpp .cxx ファイルを作成し、対応するコンパイラを呼び出してコンパイルします。

C のオーバーロードやクラスメソッドなど、C でサポートされていない構文を Go で使用するには、C 言語の標準関数のレイヤーでラップする必要があることに注意してください。 C 言語で C を呼び出すのと同じです。 [関連する推奨事項: Go ビデオ チュートリアル プログラミング教育 ]

C

## での Go の呼び出し

次のテストで問題が発生した場合は、続行する前に go clean を試し、プロジェクトをリセットしてください。

Go 関数は C にエクスポートできます。エクスポートする関数の前に

//export funcname を追加し、go build -buildmode =c を使用するだけです。 -shared -o libxxx.so このコマンドは、C 言語で使用する動的ライブラリとヘッダー ファイルをコンパイルして生成します。

Go言語はC言語と互換性がありますか?
Go言語はC言語と互換性がありますか?

また、次のこともできます。

go build -buildmode=c-archive -o libxxx.a を使用して、C 言語で使用できる静的ライブラリをコンパイルして生成します。

データ型の違い

2つの言語間の呼び出しは、実際にはデータの転送処理です。結局のところ、この 2 つは言語が異なるため、この 2 つの間でやり取りできるデータ型には制限があります。場合によっては、次のコードのように、データ型変換を強制する必要があることがあります。

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类型数据
}

この 2 つの間で利用できる基本的な数値型変換は次のとおりです。

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)

上記の基本的な変換に加えて、型、ポインタを渡すこともできます。 C 言語の特殊な

void* ポインタは、Go の unsafe.Pointer に相当します。 C の

__int128_t および __uint128_t は、Go の [16]byte に相当します。

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是变量数据类型。

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

以上がGo言語はC言語と互換性がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。