ホームページ  >  記事  >  バックエンド開発  >  c golangの呼び出し方

c golangの呼び出し方

WBOY
WBOYオリジナル
2023-05-13 11:27:38793ブラウズ

C 言語と Golang はどちらも一般的に使用されるプログラミング言語です。構文やアプリケーション シナリオは異なりますが、どちらも独自の長所と短所があるため、アプリケーション要件に応じて異なるプログラミング言語が選択されます。しかし、C 言語と Golang を統合したい場合は、2 つの言語間の相互運用性を実現する方法を理解する必要があります。

この記事では、C言語でGolangプログラムを呼び出す方法を紹介します。 C 言語は初期のプログラミング言語であり、システム開発で広く使用されています。一方、Golang は効率的な同時実行パフォーマンスで好まれている新しいプログラミング言語です。両者を統合することで、それぞれの利点を活かし、より豊富な機能を備えたアプリケーションを実現できます。

前提条件

C 言語で Golang を呼び出す前に、Golang が環境にインストールされていることを確認する必要があります。ターミナルに次のコマンドを入力して確認できます。

$ go version

Golang のバージョン情報がターミナルに出力できれば、インストールは成功しています。

Go 関数の呼び出し

Golang は、C プログラムで直接使用できる C 言語互換 API を提供します。この API を使用して、C プログラムから Golang 関数を呼び出すことができます。手順は次のとおりです。

  1. まず、Golang 関数を定義するときに、関数名の前に //export を追加する必要があります。これにより、関数インターフェイスが C プログラムに公開されます。
package main

import "C"

//export Add
func Add(x, y int) int {
    return x + y
}

この例では、2 つの整数を受け入れ、その合計を返す Add 関数を定義します。 //export コマンドを通じて、この関数のインターフェイスを C プログラムに公開します。

  1. 次に、Golang 関数を呼び出すときにハンドルを保存するために、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;
}
  1. これで、関数ポインタを使用して Golang 関数 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 サイトの他の関連記事を参照してください。

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