C 言語と Golang はどちらも一般的に使用されるプログラミング言語です。構文やアプリケーション シナリオは異なりますが、どちらも独自の長所と短所があるため、アプリケーション要件に応じて異なるプログラミング言語が選択されます。しかし、C 言語と Golang を統合したい場合は、2 つの言語間の相互運用性を実現する方法を理解する必要があります。
この記事では、C言語でGolangプログラムを呼び出す方法を紹介します。 C 言語は初期のプログラミング言語であり、システム開発で広く使用されています。一方、Golang は効率的な同時実行パフォーマンスで好まれている新しいプログラミング言語です。両者を統合することで、それぞれの利点を活かし、より豊富な機能を備えたアプリケーションを実現できます。
前提条件
C 言語で Golang を呼び出す前に、Golang が環境にインストールされていることを確認する必要があります。ターミナルに次のコマンドを入力して確認できます。
$ go version
Golang のバージョン情報がターミナルに出力できれば、インストールは成功しています。
Go 関数の呼び出し
Golang は、C プログラムで直接使用できる C 言語互換 API を提供します。この API を使用して、C プログラムから Golang 関数を呼び出すことができます。手順は次のとおりです。
//export
を追加する必要があります。これにより、関数インターフェイスが C プログラムに公開されます。 package main import "C" //export Add func Add(x, y int) int { return x + y }
この例では、2 つの整数を受け入れ、その合計を返す Add
関数を定義します。 //export
コマンドを通じて、この関数のインターフェイスを C プログラムに公開します。
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; }
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; }
この例では、NewAddFunc
を定義して、Add
関数の関数ポインターを取得します。関数ポインタの取得に失敗した場合は、エラーメッセージを出力してプログラムを終了します。関数ポインタを取得したら、それを通じて Add
関数を直接呼び出し、2 つの整数パラメータを入力し、printf
関数を通じて計算結果を出力します。
注: コンパイルする前に、コンパイルされたプログラムが Golang ライブラリに正しくリンクできることを確認するために、コマンド ラインに次のパラメータを追加する必要があります。上記の手順により、C プログラム内で Golang 関数を簡単に呼び出すことができ、元の C プログラムでは実現するのが難しい機能を実現できます。同時に、このプロセスを実行するときに、データの正しい転送と型の正しい一致を保証するために、関数ポインターとデータ構造を定義する必要があることもわかりました。実際のアプリケーションでは、実際の状況に応じて柔軟な調整や修正を行う必要があります。
以上がc golangの呼び出し方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。