手順:

  1. Goで関数を作成、//exportコメントを利用してexportする
  2. Goをライブラリにコンパイルする(ヘッダーファイルも生成される)
  3. Cで生成されたヘッダーファイルをincludeしてコールする

1. Goで関数を作成、//exportコメントを利用してexportする

// functionsInGo.go

package main

import "C"
import "fmt"

//export hello
func hello(name string) {
    fmt.Println("Hello from GO!", name)
}

func main() {
}

//export helloというコメントは、goのコンパイラに「この関数をexportする」と伝達するので、略してはいけない (コメントの記述だけど、コメントじゃない笑)

2. Goをライブラリにコンパイルする(ヘッダーファイルも生成される)

go build -o functionsInGo.o -buildmode=c-shared functionsInGo.go

上記のコマンドを叩くと、functionsInGo.hfunctionsInGo.oが生成される。

3. Cで生成されたヘッダーファイルをincludeしてコールする

// hello.c

#include <stdio.h>
#include "functionsInGo.h"

int main(int argc, char **argv) {
    GoString name = {"World!", 6};
    hello(name);

    return 0;
}

コンパイルしてコールすると:

gcc -o hello hello.c ./functionsInGo.o
./hello

Hello from GO! World!