• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Golang > 在Golang中使用C语言代码实例

在Golang中使用C语言代码实例

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了golang 实例,golang c dll,golang 调用c,c golang,golang语言等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

cgo 使得在 Golang 中可以使用 C 代码。

Hello World

为了有一个较为直观的了解,我们来看一个简单的例子,创建文件 main.go:
package main
 
/*
#include <stdio.h>
 
void sayHi() {
    printf("Hi");
}
*/
import "C"
 
func main() {
    C.sayHi()
}
</div>
执行程序:
go run main.go
</div>
程序执行并输出 hi(更多的范例可以见 $GOROOT/misc/cgo)。

Windows 下的准备工作

如果想要在 Windows 上使用 cgo,那么需要安装 gcc 编译器,这里我使用 mingw-w64。

设置编译和链接标志

我们使用 import “C” 导入的是一个伪包(pseudo-package),我们通过其来使用 C 代码。在 import “C” 之前,紧跟着 import “C” 的注释可以包括:

1.编译器和链接器标志
2.C 代码

我们可以通过 #cgo 指令来设置编译器和链接器标志,例如:
// #cgo CFLAGS: -DPNG_DEBUG=1
// #cgo amd64 386 CFLAGS: -DX86=1
// #cgo LDFLAGS: -lpng
// #include <png.h>
import "C"
</div>

附带提及一点的是,这些指令中可以包含构建约束(build constraint),详细内容见:http://golang.org/pkg/go/build/#hdr-Build_Constraints。

常用的 #cgo 指令有:

1.CPPFLAGS、CFLAGS 指令被用于编译当前包中的 C 文件(任何的 .c、.s、.S 文件)
2.CPPFLAGS、CXXFLAGS 指令被用于编译当前包中的 C++ 文件(任何的 .cpp、.cc、.cxx 文件)
3.LDFLAGS 指令用于指定链接器标志
4.pkg-config 指令用于通过 pkg-config 工具获取编译器和链接器标志(例如:#cgo pkg-config: png cairo)

Golang 引用 C

结构体上需要注意的点:

1.C 结构体的域名称如果为 Golang 的关键字时,访问时需要在域名称前面加上 _。比如说,C 中有一个结构体变量 x,此变量对应的结构体中有一个域 type,那么在 Golang 中需要通过 x._type 来访问 type 域
2.结构体的位域、非对齐数据等无法在 Golang 中表示时会被忽略
3.Golang 结构体中不能使用 C 类型的域

标准的 C 数值类型对应:

1.C.char
2.C.schar(signed char)
3.C.uchar(unsigned char)
4.C.short
5.C.ushort(unsigned short)
6.C.int
7.C.uint(unsigned int)
8.C.long
9.C.ulong(unsigned long)
10.C.longlong(long long)
11.C.ulonglong(unsigned long long)
12.C.float
13.C.double

任何的 C 函数(包括 void 函数)都可以返回一个返回值和 C 的 errno 变量(作为错误):
n, err := C.sqrt(-1)
_, err := C.voidFunc()
</div>

直接调用 C 函数指针目前还无法支持。

有一些特殊的函数可以用于 C 类型和 Golang 类型之间转换(通过数据拷贝的方式),伪定义如下:

// Golang 的字符串转为 C 字符串
// C 的字符串是使用 malloc 分配的,因此,此函数的调用者
// 需要调用 C.free 来释放内存
func C.CString(string) *C.char
 
// 转换 C 字符串到 Golang 字符串
func C.GoString(*C.char) string
 
// 转换一定长度的 C 字符串到 Golang 字符串
func C.GoStringN(*C.char, C.int) string
 
// 转换一块 C 内存区域到 Golang 的字节数组中去
func C.GoBytes(unsafe.Pointer, C.int) []byte
</div>

其他需要注意的点:

1.C 语言中的 void* 对应 unsafe.Pointer
2.C 语言中的结构、联合、枚举类型(而非变量),在 Golang 中需要加上 struct_、union_、enum_ 前缀访问。由于 Golang 中没有联合这种数据类型,因此 C 的联合在 Golang 中被表示为字节数组
3.和 C 语言等价的那些类型是不可以导出的

</div>

您可能想查找下面的文章:

  • Golang继承模拟实例详解
  • Golang中的sync.WaitGroup用法实例
  • 在Golang中使用C语言代码实例

相关文章

  • 在ubuntu下构建go语言开发环境的方法
  • Go语言中的方法、接口和嵌入类型详解
  • Go语言Cookie用法分析
  • Go语言实现简单Web服务器的方法
  • Golang学习笔记(六):struct
  • Go语言里的new函数用法分析
  • 详解Golang编程中的常量与变量
  • GO语言基本数据类型总结
  • GO语言利用K近邻算法实现小说鉴黄
  • Golang加密解密之RSA(附带php)

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Go语言操作mysql数据库简单例子
    • Go语言调用其它程序并获得程序输出的方法
    • Go语言的方法接受者类型用值类型还是指针类型?
    • golang简单tls协议用法完整示例
    • Go语言通过Luhn算法验证信用卡卡号是否有效的方法
    • 利用Go语言初步搭建一个web应用的教程
    • Go语言服务器开发之客户端向服务器发送数据并接收返回数据的方法
    • Go语言中普通函数与方法的区别分析
    • Go语言并发技术详解
    • GO语言运行环境下载、安装、配置图文教程

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有