由于工作原因,需要实现go语言与c语言的相互调用。由于go语言与c语言有着千丝万缕的暧昧关系,两者之间的调用可以通过语言层面实现。下文是对此的总结。

go语言调用c语言

以下为一个简短的例子:

package main

// #include

// #include

/*

void print(char *str) {

printf("%s\n", str);

}

*/

import "C"

import "unsafe"

func main() {

s := "Hello Cgo"

cs := C.CString(s)

C.print(cs)

C.free(unsafe.pointer(cs))

}

与“正常”的go代码相比,上述代码有几处“特殊”的地方:

在开头的注释中出现了c语言头文件的include字样

在注释中定义了c语言函数print

import了一个名为C的“包”

在main函数中调用了上述定义的c语言函数print

首先,go源码文件中的c语言代码是需要用注释包裹的,就像上面的include头文件以及print函数定义;其次,import "C"这个语句是必须的,而且其与上面的c代码之间不能用空行分隔,必须紧密相连。这里的”C“不是包名,而是一种类似名字空间的概念,或可以理解为伪包,c语言所有语法元素均在该伪包下面;最后,访问c语法元素时都要在其前面加上伪包前缀,比如C.uint和上面代码中的C.print、C.free等。

更详细的在go中调用c语言的用法可以参考Go与C语言的互操作,本文不再一一细述。

在上面的例子中,c语言是内嵌在go代码中的,如果代码量更大更复杂的话,这显然是很不”专业“的。那么,是否可以将c语言代码从go代码中分离出去,单独定义呢?答案是肯定的,可以通过共享库的方式实现。

cgo提供了#cgo指示符可以指定go源码在编译后与哪些共享库进行链接。例子如下:

// hello.go

package main

// #cgo LDFLAGS: -L ./ -lhello

// #include

// #include

// #include "hello.h"

import "C"

func main() {

C.hello()

}

// hello.c

#include "hello.h"

void hello()

{

printf("hello, go\n");

}

// hello.h

extern void hello();

其中在hello.go中,#cgo指示符后面添加LDFLAGS: -L ./ -lhello,作用是在go代码编译时,指定在当前目录查找so库并进行链接。

因此,只需要把hello.c编译成动态库,再编译go代码,即可在运行go代码的时候调用共享库中的c语言函数。指令如下:

gcc -fPIC -o libhello.so hello.c

go build -o hello

./hello

c语言调用go语言

与在go中调用c源码相比,在c中使用go函数的场合较少。因为一般来说,采用高级语言作为粘合剂调用低级语言能充分发挥各自的特点,而用低级语言调用高级语言反而有可能降低低级语言的性能优势,在go中,可以使用”export + 函数名“来导出go函数为c代码所用,看一个简单的例子:

// hello.go

package main

import "C"

import "fmt"

// export Go2C

func Go2C() {

fmt.Println("hello, C")

}

可通过go build的编译选项,将go代码编译成共享库以供c代码调用。注意,编译so库时必须存在main及main函数(即使main函数为空)。编译指令如下:go build -v -x -buildmode=c-shared -o libhello.so hello.go。

编译成功后,只需在c代码中引入新生成的头文件及编译时链接动态库即可实现go函数的调用。代码如下:

// hello.c

#include

#include "libhello.h"

int main()

{

Go2C();

return 0;

}

通过gcc -o hello -L. -lhello,即可编译成可执行程序。注意,运行前必须确定共享库运行时查找路径中存在需要链接的共享库,可通过将so库路径放到/usr/lib或者修改环境变量LD_LIBRARY_PATH。

小结

go语言可以通过内嵌c代码的形式调用c语言,也可以通过调用共享库函数的方式实现;至于c语言调用go函数,则可以通过go build将go代码编译成共享库提供给c代码使用。注意,本文中的共享库均为动态共享库,至于静态共享库则未曾实验,有兴趣的可以实现一下。

c语言中go的作用,go语言与c语言的相互调用相关推荐

  1. c语言中b的作用是什么意思,C语言中是什么意思?ab怎么理解?

    C语言中&是什么意思?a&b怎么理解?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C语言中& ...

  2. C语言中return1的作用,return 1在c语言中的意思

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. return 1在c语言中的意思是返回值为一. C语言是一门面向过程.抽象化的通用程序设计语言,广泛应用于底层开发.C语言能以简易 ...

  3. C语言中static的作用及C语言中使用静态函数有何好处

    转自:http://www.jb51.net/article/74830.htm 在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0. 在C语言中,static ...

  4. php的cookie变量作用,PHP语言中cookie的作用

    PHP语言中cookie的作用 时间:2015-11-9 Cookie的概念最早是由Netscape在1994年提出来的,它是保存在浏览器中的小信息包,更确切地说,Cookie是保存在客户端硬盘里的, ...

  5. c语言while作用范围,c语言中while是什么意思啊? , c语言while循环的表达式

    导航:网站首页 > c语言中while是什么意思啊? , c语言while循环的表达式 c语言中while是什么意思啊? , c语言while循环的表达式 匿名网友: 事例程序:void mai ...

  6. 以下关于c语言中static和const,c语言中static const作用

    c语言中static const作用 (2012-06-21 07:51:08) 标签: it 关键字static: 1. 在函数体内,一个被声明为静态的变量在这一个函数被调用的过程中维持其值不变. ...

  7. c语言求字符ascii,C语言中ASCII码是什么意思? c语言怎么求字符的ascii码

    导航:网站首页 > C语言中ASCII码是什么意思? c语言怎么求字符的ascii码 C语言中ASCII码是什么意思? c语言怎么求字符的ascii码 相关问题: 匿名网友: 是一个字符表,一个 ...

  8. java中flush函数作用_Java语言中flush()函数作用及使用方法详解

    最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写 ...

  9. c语言中char是多少字节,c语言中char_char c = \'\\1\' 十进制是多少_c语言char

    网友求助:c语言中char_char c = \"\\1\" 十进制是多少_c语言char 问题 最佳答案 推荐答案 char一般默认是1个字节的无符号整型,范围0~255.如果是 ...

  10. 简述c语言中break的作用,c语言break什么意思?

    break在一些计算机语言中是保留字,其作用大多情况下是终止上一层的循环,以C语言来说,break在switch(开关语句)中在执行一条case后跳出语句的作用. 1. C语言中的break : br ...

最新文章

  1. Vue父组件调用子组件的方法并传参的两种方式(用$refs.refName.functionName、window.function)
  2. 从IT人士到IT经理倪应该学会的30 项技能
  3. 通过SSH克隆远程仓库(GitLab)到本地
  4. SQL的3个主要组成
  5. SAP云平台API portal里的discover all功能
  6. SWOT分析是神马?
  7. Sql Server判断某列字段是否为空或判断某列字段长度
  8. P1119 灾后重建(floyd进阶)
  9. ios textView显示不全
  10. 虚拟机 安装 linux 分辨率 调整
  11. 数据中台外部演示脚本
  12. 厘米换算英尺英寸(C语言程序设计)
  13. AttributeError: ‘RDD‘ object has no attribute ‘toDF‘
  14. Package cmake is not available, but is referred to by another package.
  15. lending club 贷款逾期分析
  16. 企查猫app数据解密
  17. rar、zip、7z等压缩率的测试
  18. Window纯净系统安装详细教程
  19. 所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
  20. 解决hexo部署github时hexo d成功,但github仍显示初始页面问题

热门文章

  1. MySQL快速查询的12条建议,让你不止会用select *
  2. 次元网站女装穿起来,从A站到Z站,你知道哪个?谁才是你的最爱?
  3. 基于依存句法分析的关键短语抽取算法实战
  4. ubuntu raid 配置磁盘阵列
  5. 原理图连线有错误提醒_拔罐方法不对=缩短生命,中医提醒,拔火罐警惕三个禁忌...
  6. 如何让excel表格排头一直都在_Excel表格技巧—如何计算矩阵相乘
  7. Python入门100题 | 第002题
  8. 关于后端java项目使用SpringBoot框架的报错总结
  9. 第五章--预处理理论
  10. HBASE+Solr实现详单查询--转