中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

C和Go相互調(diào)用

2018-09-04    來(lái)源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢(shì)上線(xiàn)!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

C可以調(diào)用Go,并且Go可以調(diào)用C, 如果更進(jìn)一步呢, C-->Go-->C 或者 Go-->C-->Go 的調(diào)用如何實(shí)現(xiàn)?

本文通過(guò)兩個(gè)簡(jiǎn)單的例子幫助你了解這兩種復(fù)雜的調(diào)用關(guān)系。本文不涉及兩者之間的復(fù)雜的數(shù)據(jù)轉(zhuǎn)換,官方文章 C? Go? Cgo! 、 wiki/cgo 和 cmd/cgo 有一些介紹。

Go-->C-->Go

Go程序調(diào)用C實(shí)現(xiàn)的函數(shù),然后C實(shí)現(xiàn)的函數(shù)又調(diào)用Go實(shí)現(xiàn)的函數(shù)。

1、首先,我們新建一個(gè) hello.go 的文件:

hello.go

package main

import "C"
import "fmt"

//export HelloFromGo
func HelloFromGo() {
 fmt.Printf("Hello from Go!\n")
}

它定義了一個(gè) HelloFromGo 函數(shù),注意這個(gè)函數(shù)是一個(gè)純的Go函數(shù),我們定義它的輸出符號(hào)為 HelloFromGo 。

2、接著我們新建一個(gè) hello.c 的文件:

hello.c

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

int helloFromC() {
 printf("Hi from C\n");
 //call Go function
 HelloFromGo();
 return 0;
}

這個(gè)c文件定義了一個(gè)C函數(shù) helloFromC ,內(nèi)部它會(huì)調(diào)用我們剛才定義的 HelloFromGo 函數(shù)。

這樣,我們實(shí)現(xiàn)了 C 調(diào)用 Go : C-->Go ,下面我們?cè)賹?shí)現(xiàn)Go調(diào)用C。

3、最后新建一個(gè) main.go 文件:

main.go

package main

/*
extern int helloFromC();
*/
import "C"

func main() {
 //call c function
 C.helloFromC()
}

它調(diào)用第二步實(shí)現(xiàn)的C函數(shù) helloFromC 。

運(yùn)行測(cè)試一下:

$ go run .
Hi from C
Hello from Go!

可以看到,期望的函數(shù)調(diào)用正常的運(yùn)行。第一行是C函數(shù)的輸出,第二行是Go函數(shù)的輸出。

C-->Go-->C

第二個(gè)例子演示了C程序調(diào)用Go實(shí)現(xiàn)的函數(shù),然后Go實(shí)現(xiàn)的函數(shù)又調(diào)用C實(shí)現(xiàn)的函數(shù)。

1、首先新建一個(gè) hello.c 文件:

hello.c

#include <stdio.h>

int helloFromC() {
 printf("Hi from C\n");
 return 0;
}

它定義了一個(gè)純C實(shí)現(xiàn)的函數(shù)。

2、接著新建一個(gè) hello.go 文件:

// go build -o hello.so -buildmode=c-shared .
package main

/*
extern int helloFromC();
*/
import "C"

import "fmt"

//export HelloFromGo
func HelloFromGo() {
	fmt.Printf("Hello from Go!\n")
	C.helloFromC()
}

func main() {

}

它實(shí)現(xiàn)了一個(gè)Go函數(shù) HelloFromGo ,內(nèi)部實(shí)現(xiàn)調(diào)用了C實(shí)現(xiàn)的函數(shù) helloFromC ,這樣我們就實(shí)現(xiàn)了 Go-->C 。

注意包名設(shè)置為 package main ,并且增加一個(gè)空的 main 函數(shù)。

運(yùn)行 go build -o hello.so -buildmode=c-shared . 生成一個(gè)C可以調(diào)用的庫(kù),這調(diào)命令執(zhí)行完后會(huì)生成 hello.so 文件和 hello.h 文件。

3、最后新建一個(gè)文件夾,隨便起個(gè)名字,比如 main

將剛才生成的 hello.so 文件和 hello.h 文件復(fù)制到 main 文件夾,并在 main 文件夾中新建一個(gè)文件 main.c :

main.c

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

int main() {
 printf("use hello lib from C:\n");
 
 HelloFromGo();
 
 return 0;
}

運(yùn)行 gcc -o main main.c hello.so 生成可執(zhí)行文件 main , 運(yùn)行 main :

$ ./main
use hello lib from C:
Hello from Go!
Hi from C

第一行輸出來(lái)自 main.c ,第二行來(lái)自Go函數(shù),第三行來(lái)自 hello.c 中的C函數(shù),這樣我們就實(shí)現(xiàn)了 C-->Go--C 的復(fù)雜調(diào)用。

參考文檔

  1. https://medium.com/using-go-in-mobile-apps/using-go-in-mobile-apps-part-1-calling-go-functions-from-c-be1ecf7dfbc6
  2. https://github.com/vladimirvivien/go-cshared-examples
  3. http://golang.org/cmd/cgo
  4. https://gist.github.com/zchee/b9c99695463d8902cd33
  5. https://medium.com/@liamkelly17/working-with-packed-c-structs-in-cgo-224a0a3b708b

 

來(lái)自:https://colobu.com/2018/08/28/c-and-go-calling-interaction/

 

標(biāo)簽:

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀(guān)點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:一次Java內(nèi)存泄漏調(diào)試的有趣經(jīng)歷

下一篇:谷歌推出最新AngularJS升級(jí)工具,可快速遷移至Angular