首先先上代码,看看效果。

package main/*
#include <stdio.h>void sayHello(){printf("hello, world!");
}
*/
import "C"func main(){C.sayHello()
}

如果在执行时报错exec: "gcc": executable file not found in %PATH%,可以查看executable file not found in %PATH%的解决。

Go语言是如何设别代码中的C语言,又是如何执行的呢。

这就需要了解一个工具cgo,它是Go语言自带的特殊工具,可以使我们创建能够调用C语言代码的Go语言源码文件。

在默认情况下,它是打开的。通过go env命令可以查看它的设置情况,其中set CGO_ENABLED=1表示cgo工具可用,当设置为0时,表示工具不可用。

上面代码中的import "C"的作用就是为了告诉cgo工具,在这个源码文件中需要调用C代码。在该语句之前的代码是一些注释,也叫序文,用来写出我们真正需要使用的C语言接口文件的名称。

注意:序文和命令import "C"之间不能有空行,否则程序会报错。

接着通过下面的代码,我们来了解另外一个需要知识:类型转化。

package main/*
#include <stdio.h>double FindMaxNum(double n1, double n2, double n3){double maxNum;if(n1>n2&&n1>=n3)maxNum=n1;if(n2>=n1&&n2>=n3)maxNum=n2;if(n3>=n1&&n3>=n2)maxNum=n3;return maxNum;
}
*/
import "C"
import "fmt"func main(){n1:=C.double(1.23)n2:=C.double(3.45)n3:=C.double(6.78)result:=C.FindMaxNum(n1,n2,n3)fmt.Println(result)
}

上面示例中,由于函数FindMaxNum接收三个参数,而且这三个参数必须是C语言中的double类型,而不是Go语言中的double类型。如果上面代码未经转化,则会在编译时报错。

# command-line-arguments
.\test18.go:27: cannot use n1 (type float64) as type C.double in argument to _Cfunc_FindMaxNum
.\test18.go:27: cannot use n2 (type float64) as type C.double in argument to _Cfunc_FindMaxNum
.\test18.go:27: cannot use n3 (type float64) as type C.double in argument to _Cfunc_FindMaxNum

因此在调用函数之前,需要先将它们的类型进行转化。

在cgo工具的环境中,C语言的double类型与C.double相对应,其他C语言类型写法类似,

如:

C.char、C.schar(有符号字符类型)、C.uchar(无符号字符类型)、C.short、C.ushort(无符号短整数类型)、C.int、C.uint(无符号整数类型)、C.long、C.ulong(无符号长整数类型)、C.longlong(无符号的long long类型)、C.float和C.double。

注意: C语言类型void *对应于Go语言的类型unsafe.Pointer。

在C语言中没有像Go语言中独立的字符串类型,C语言使用最后一个元素为”\0”的字符数组来代表字符串。

在Go语言的字符串和C语言的字符串之间进行转化的时候,我们就需要用到代码包C中的C.CString、C.GoString和C.GoStringN等函数。

这些转化操作通过对字符串数据的拷贝来完成的,Go语言内存管理器并不能感知此内存分配操作,因为它们是由C语言代码引发的。

所以,我们在使用C.CString类似的会导致内存分配操作的函数时,需要调用代码包C的free函数(函数头文件stdlib.h或malloc.h)以手动释放内存。

说到这个我们来看一个示例,了解下另外一个需要了解的知识:unsafe包

package main/*
#include <stdio.h>
#include <stdlib.h>
void myprint(char* str){printf("the content is:%s\n",str);
}
*/
import "C"
import "unsafe"func main(){Print("hello world!")
}func Print(s string) {cs:=C.CString(s)defer C.free(unsafe.Pointer(cs))C.myprint(cs)
}

unsafe包包含一些有关Go程序类型安全的操作,来看看Pointer是如何定义的。Pointer表示任意类型的指针,它有四种可用于其他类型的特殊操作。

  • 任何类型的指针值都可以转化为Pointer
  • Pointer可以转化为任何类型的指针值
  • uintptr可以转化为Pointer
  • Pointer可以转化为uintptr

Pointer程序打破类型系统的限制,允许读写任意内存,因此应该非常小心的使用它。

golang 调用c代码相关推荐

  1. golang 调用 c 动态库so 静态库a

    目录 Golang中嵌入C代码 Golang中调用C的动态库so Golang调用C的静态库a Golang与C的关系非常密切,下面主要介绍在Golang中使用C. Golang中嵌入C代码 pack ...

  2. golang调用sdl2,键盘和鼠标事件

    golang调用sdl2,键盘和鼠标事件 win10 x64下测试成功,其他操作系统下不保证成功. 采用的是syscall方式,不是cgo方式. 见地址 代码用golang编写.代码如下: packa ...

  3. Golang 调用MySQL存储过程

    原创:转载请标明出处: https://blog.csdn.net/ming2316780/article/details/86499344 本文出自:[iGoogle.ink的博客] Golang ...

  4. matlab中调用java代码_Matlab中调用第三方Java代码

    在Java中采用Matlab JA Builder可以实现调用m文件,采用这样的方式,可在Matlab的M文件中,直接调用Java类.这种方式可以表示为Java--> Matlab( m, Ja ...

  5. ruby调用java代码

    为什么80%的码农都做不了架构师?>>>    ruby使用rjb调用java代码 require 'rjb'#加载jar包 Rjb::load(classpath = '/home ...

  6. Node.js调用C#代码

    https://github.com/tjanczuk/edge 运行的时候会报 System.DllnotfoundException 无法加载node.dll,要把\packages\Edge.j ...

  7. java实时汇率的接口_eoLinker-API_Shop_汇率查询_API接口_Java调用示例代码

    eoLinker-API Shop 汇率查询 Java调用示例代码 汇率查询 提供汇率转换.单个货币对应的热门货币汇率行情,包括人民币.美元.欧元.英镑等100多种货币的实时汇率查询. 该产品拥有以下 ...

  8. 在R中调用Java代码

    我们都知道Java语言长期处于霸主地位,在所有编程语言排行榜中,Java也是常年位居第一.在近几年也是爆炸式发展,几乎覆盖到了应用开发的所有领域.而R语言则在统计圈和数据可视化处于佼佼者,如果将Jav ...

  9. Java利用JNI调用c++代码简易例子演示

    点击打开链接 (提取码:8676) 一.首先简单交代一下两个问题: 1.什么是JNI                - - -     JNI的全名为Java Native Interface(Jav ...

最新文章

  1. centos6.5官方dvd做本地yum
  2. 00018计算机应用基础2019年4月,2019年4月自考计算机应用基础考前试题和答案00018.pdf...
  3. CF758 D. Ability To Convert 细节处理字符串
  4. FlashPaper安装及使用方法
  5. Hibernate中的3中状态
  6. hal 外部唤醒脚唤醒_探索者 STM32F407 开发板资料连载第二十二章 待机唤醒实验...
  7. linux 平台,Qt 使用,微软雅黑/文泉驿 字体
  8. 只要还在路上前行着的,那都是一个个闪闪发光惹人爱的人啊
  9. python文件操作方法seek_Python文件操作及seek偏移详解
  10. 如何给Word中的图片添加题注
  11. 用C语言打印菱形图案
  12. Google Earth Engine(GEE)——NASA-USDA增强型SMAP全球土壤水分数据以10公里的空间分辨率提供全球的土壤水分信息
  13. HTML常用meta小结
  14. pyinstaller打包指南,No module named xxx,is only available if OpenCV is installed.虚拟环境打包
  15. preHandle执行多次问题
  16. 从零搭建vue-ssr详细介绍
  17. 单元测试总结反思_语文单元考试反思
  18. 量化进阶——为何需要进行量化对冲
  19. python 正则表达式生成_python正则表达式
  20. 聊斋2聂小倩java华语版,九个版本的聂小倩,看全的没有几个,经典也不是王祖贤!...

热门文章

  1. [翻译]一步步教你配置SQL SERVER合并复制(五)配置Publisher(上)
  2. OpenUPF 是释放 5G 潜力的金钥匙
  3. Python Module_Socket_网络编程
  4. ASCII、GB2312、GBK、Unicode、UTF-8介绍和转换
  5. 示波器探头使用注意事项,示波器探头的选择
  6. Jenkins+Ant+TestNG+Testlink自动化构建集成
  7. vue 原理简单实现
  8. python第三方库之Django学习笔记一
  9. Win7快捷方式图标不显示解决办法
  10. 在Eclipse中导入Tiny工程,有下面的错误,是什么原因?