go语言兼不兼容c语言
来源:亿速云
时间:2023-03-02 11:34:49 422浏览 收藏
最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《go语言兼不兼容c语言》主要内容涉及到C语言、go语言等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~
这篇“go语言兼不兼容c语言”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go语言兼不兼容c语言”文章吧。
go语言兼容c语言;Go语言可以调用C语言,还能给C语言调用。Go语言工具包中有一个Cgo命令,它用来处理Go调用C相关操作;而Go的函数可以导出给C用,只要在要导出的函数前面加上“//export funcname”就行了,然后可以使用“go build -buildmode=c-shared -o libxxx.so”命令编译生成动态库和头文件供C语言中使用。
c语言和golang是兼容的。你用c写的.c文件是可以被golang引用,直接使用的。
现代的各种高级的编程语言很多都是在C语言之上构建的,基本上也都能够调用C语言,并且这个在某些情况下也是有这个需求和存在的意义的。Go语言对这方面支持的挺不错,不光可以调用C语言,还能给C语言调用。这篇文章将对相关的内容做个说明。
基础说明
Go语言工具包中有一个Cgo命令,它用来处理Go调用C相关操作。 我们可以直接使用该命令,也可以在运行或构建Go程序时自动调用它。
Cgo对于C语言的处理本身是依赖系统中C语言相关的编译工具链的,所以需要注意对此的设置,主要是Go的环境变量设置:
特别需要注意的是Cgo需要使能,可以使用 go env -w CGO_ENABLED=1
命令来设置。上图中可以看到一些C编译时的FLAGS参数,如果有需要也可以进行相应设置调整。另外上面的 CC
CXX
是编译工具链的设置,也可以根据需求设置调整。
Go中调用C
Go中调用C语言最终在Go中都显示为名为 C
的伪包, 在Go中 import "C"
行之上以注释 #include ...
方式来引用C语言相关的库。 这些被引用的库中公共的变量和函数等在Go中会被挂到 C
包中以供使用。下面是个简单的演示:
在Go中调用C只要上面这样就行了,使用起来还是很方便的。
通常来说C语言程序的项目中除了C语言代码外可能还有汇编代码;或者项目也有可能是C/C++混合编程的。这些项目都可以在Go中使用,Cgo会自动识别后缀为 .c
.s
.S
.sx
.cc
.cpp
.cxx
的文件,并调用对应的编译器去编译。
需要注意的是C++中的重载和类方法等C不支持的语法想要在Go中使用都需要用C语言标准函数包装一层,使用方法就和C语言中调用C++一样。
C中调用Go
下面测试中如果有问题可以尝试 go clean
重置项目后再进行。
Go的函数可以导出给C用,只要在要导出的函数前面加上 //export funcname
就行了,然后可以使用 go build -buildmode=c-shared -o libxxx.so
命令编译生成动态库和头文件供C语言中使用:
另外也可以使用 go build -buildmode=c-archive -o libxxx.a
编译生成可用C语言使用的静态库。
数据类型差异
两个语言间调用其实就是数据的传递处理,需要注意的是因为两者毕竟不是同一种语言所以两者之间可以交互的数据类型是有限制的。有些时候也会有强制转换数据类型的需求,比如下面这个代码:
package rand // #includeimport "C" func Random() int { return int(C.random()) // C函数返回值给Go,random的返回值是long类型 } func Seed(i int) { C.srandom(C.uint(i)) // Go传值给C的函数,srandom函数接收uint类型数据 }
两者间可用的基本数值类型转换有下面一些:
C.char, C.schar (signed char), C.uchar (unsigned char) C.short, C.ushort (unsigned short) C.int, C.uint (unsigned int) C.long, C.ulong (unsigned long) C.longlong (long long), C.ulonglong (unsigned long long) C.float, C.double C.complexfloat (complex float), C.complexdouble (complex double)
除了上面的基础类型,指针也是可以传递的。特别的C语言中的 void*
指针相当于Go中的 unsafe.Pointer
。
C中的 __int128_t
和 __uint128_t
相当于Go中的 [16]byte
。
C中函数传输参数为数组的话直接传递数组名就行,在Go中向这类函数传递数组需要传递数组第一个元素的地址,另外需要注意的是数组中元素也必须是C语言中支持的类型:
C.f(&C.arr[0])
C中并没有string类型,使用字符串时需要进行处理:
package print // #include// #include import "C" import "unsafe" func Print(s string) { cs := C.CString(s) // 这个方式会将字符串拷贝一份,返回指针,注意使用完需要释放内存 defer C.free(unsafe.Pointer(cs)) // defer修饰的语句会在该函数退出前执行 C.fputs(cs, (*C.FILE)(C.stdout)) }
另外C语言的字符串 *C.char
可以使用 C.GoString()
转换成Go中的字符串。
C中的 struct
union
enum
这些类型在Go使用需要加上对应的前缀,变成 struct_xxx
union_xxx
enum_xxx
。其中联合体在Go中将成为字节数组的形式。这些对象的成员名如果和Go的关键词一样的话,在Go中使用需要在成员名前面加下划线,比如 x._name
。
C中的 sizeof
在Go中需要使用 C.sizeof_T
方式使用,T是变量数据类型。
以上就是关于“go语言兼不兼容c语言”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注golang学习网行业资讯频道。
文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《go语言兼不兼容c语言》文章吧,也可关注golang学习网公众号了解相关技术文章。
-
185 收藏
-
460 收藏
-
430 收藏
-
450 收藏
-
320 收藏
-
233 收藏
-
322 收藏
-
181 收藏
-
316 收藏
-
244 收藏
-
300 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 开心的巨人
- 这篇文章出现的刚刚好,很详细,受益颇多,收藏了,关注楼主了!希望楼主能多写Golang相关的文章。
- 2023-05-03 09:53:14
-
- 和谐的山水
- 这篇技术文章真及时,很详细,太给力了,已收藏,关注作者了!希望作者能多写Golang相关的文章。
- 2023-05-02 23:29:17
-
- 坚定的网络
- 太详细了,已加入收藏夹了,感谢老哥的这篇博文,我会继续支持!
- 2023-04-12 14:22:29
-
- 潇洒的酒窝
- 这篇技术文章真是及时雨啊,师傅加油!
- 2023-04-11 06:33:48
-
- 淡然的萝莉
- 这篇文章内容真是及时雨啊,好细啊,真优秀,已加入收藏夹了,关注师傅了!希望师傅能多写Golang相关的文章。
- 2023-03-26 17:03:39
-
- 爱听歌的小馒头
- 很棒,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢大佬分享文章!
- 2023-03-16 17:58:38
-
- 风趣的睫毛膏
- 好细啊,已加入收藏夹了,感谢作者大大的这篇技术文章,我会继续支持!
- 2023-03-13 09:57:29
-
- 等待的云朵
- 这篇文章内容太及时了,博主加油!
- 2023-03-10 20:44:36
-
- user_1678689486
- 真优秀,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢作者分享文章!
- 2023-03-03 20:38:38