iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >go语言兼不兼容c语言
  • 203
分享到

go语言兼不兼容c语言

2023-07-04 20:07:18 203人浏览 八月长安
摘要

这篇“Go语言兼不兼容C语言”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go语言兼不兼容c语言”文章吧。go语言兼容c语言

这篇“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的环境变量设置:

go语言兼不兼容c语言

特别需要注意的是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语言

在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语言兼不兼容c语言
go语言兼不兼容c语言

另外也可以使用 go build -buildmode=c-arcHive -o libxxx.a 编译生成可用C语言使用的静态库。

数据类型差异

两个语言间调用其实就是数据的传递处理,需要注意的是因为两者毕竟不是同一种语言所以两者之间可以交互的数据类型是有限制的。有些时候也会有强制转换数据类型的需求,比如下面这个代码:

package rand// #include <stdlib.h>import "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.doubleC.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 <stdio.h>// #include <stdlib.h>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语言”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网其他教程频道。

--结束END--

本文标题: go语言兼不兼容c语言

本文链接: https://www.lsjlt.com/news/347453.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • go语言兼不兼容c语言
    这篇“go语言兼不兼容c语言”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go语言兼不兼容c语言”文章吧。go语言兼容c语言...
    99+
    2023-07-04
  • Go语言是否兼容C语言的特性
    Go语言是一种由Google开发的编程语言,它具有简洁、高效、并发支持等特点,逐渐受到广泛关注和应用。在很多情况下,开发者可能需要与C语言进行交互或者利用C语言的特性,这时候就需要考虑...
    99+
    2024-03-07
    go语言 特性 兼容性 标准库
  • Go语言与C语言的兼容性探究
    Go语言与C语言的兼容性探究 近年来,Go语言作为一种编程语言在互联网行业中备受瞩目,并逐渐成为开发人员的首选之一。相比之下,C语言作为一种较为传统的编程语言,在系统级开发和性能优化方...
    99+
    2024-03-08
    go语言 c语言 兼容性 标准库
  • 深入探讨Go语言对C语言的兼容程度
    Go语言是一门由Google开发的编程语言,具有高效、简洁、并发性强等特点。它在语法结构、包管理、高级特性等方面都有很大的优势,因此备受程序员青睐。然而,在实际开发中,很多项目会涉及到...
    99+
    2024-03-07
    go语言 探讨 c兼容
  • Go语言在兼容C语言方面的优势与挑战
    Go语言在兼容C语言方面的优势与挑战 在软件开发领域,C语言一直以来都是被广泛应用的一种语言,其高效性和灵活性被认为是其他语言所无法替代的。然而,随着时代的变迁,更多的开发者开始关注到...
    99+
    2024-03-08
    挑战 go语言 兼容性 优势
  • C语言开发者是否容易转向Go语言:兼容性分析
    C语言开发者是否容易转向Go语言:兼容性分析 随着时代的变迁,编程语言的发展也在不断地演进。作为一名C语言开发者,是否容易转向使用Go语言呢?本文将从兼容性的角度进行分析,并提供具体的...
    99+
    2024-03-07
    c语转go 兼容性分析 开发者转向 go语言
  • 掌握Canvas的跨语言兼容性
    随着互联网的快速发展,Web技术也在不断更新与演进。其中,HTML5标准的制定对于Web开发者来说,无疑是一个重大的进步。而HTML5的一个重要特性就是Canvas元素,它提供了一种使用JavaScript脚本进行绘制图形的方法...
    99+
    2024-01-17
    Canvas 语言 兼容性
  • 揭秘:鸿蒙是否兼容 Go 语言的真相
    鸿蒙系统当前官方不支持 go 语言,但实际测试表明可在鸿蒙设备上编译和运行 go 程序。需要注意,由于缺乏官方支持,使用 go 语言可能会存在兼容性问题。 揭秘:鸿蒙是否兼容 Go 语...
    99+
    2024-04-08
    鸿蒙 go语言 c++
  • Windows XP系统兼容哪个版本的Go语言?
    Windows XP系统兼容哪个版本的Go语言? Go语言是一种由Google开发的编程语言,具有高效的并发编程能力和简单易用的语法特点,吸引了越来越多的开发者的关注。那么对于一些老旧...
    99+
    2024-04-02
  • Go语言在Linux系统上的兼容性如何?
    Go语言在Linux系统上的兼容性非常好,它能够无缝地在各种Linux发行版上运行,并且支持不同架构的处理器。本文将介绍Go语言在Linux系统上的兼容性,并通过具体的代码示例展示其强...
    99+
    2024-04-02
  • C++ 函数与 C 语言函数的兼容性如何?
    c++++ 兼容 c 语言函数,但在函数声明、参数重载、返回类型和参数传递方式上存在细微差别。此外,c++ 提供了异常处理机制。 C++ 函数与 C 语言函数的兼容性 C++ 语言是 ...
    99+
    2024-04-11
    c++ 函数兼容性
  • shell数据类型和go语言的兼容性如何?
    Shell脚本是一种在Unix和类Unix操作系统上执行命令的脚本语言。它是一种非常灵活的编程语言,可以用于自动化许多任务,包括文本处理、系统管理、网络管理等等。而Go语言是一种由Google开发的编程语言,它被设计用来解决现代软件开发中的...
    99+
    2023-06-24
    load shell 数据类型
  • GO语言中,二维码同步能否与Spring框架兼容?
    在现代互联网应用开发中,二维码已经成为了不可或缺的一部分,无论是在线支付、身份验证还是电子票务等等,都需要使用到二维码技术。而GO语言已经成为了互联网应用开发的热门语言之一,那么,GO语言中的二维码同步能否与Spring框架兼容呢?本文将...
    99+
    2023-08-23
    同步 二维码 spring
  • C++ 函数指针与 C 兼容性:无缝桥接两种语言
    c++++ 函数指针与 c 兼容,允许在两种语言之间无缝传递和存储函数。尽管声明语法略有不同(c++ 要求使用圆括号和引用运算符),c++ 函数指针与 c 函数指针兼容,可以相互传递。这...
    99+
    2024-04-29
    c++ 函数指针
  • ASP语法与其他语言:探索兼容性和互操作性
    ASP语法作为微软公司的主要脚本语言,它最初是在1998年发布的,随后在随后的几年中不断发展和更新。目前,最新的版本是ASP.NET Core 6.0。ASP语法具有很强的兼容性和互操作性,这意味着它能够与其他语言一起协同工作或对其进行...
    99+
    2024-02-21
    ASP脚本语言 兼容性 互操作性演示代码 不同语言协同工作
  • go语言是不是易语言
    本篇内容介绍了“go语言是不是易语言”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!go语言不是易语言,两者是不同的编程语言。go语言(又称G...
    99+
    2023-07-04
  • Go语言与C语言有哪些不同之处
    这篇文章将为大家详细讲解有关Go语言与C语言有哪些不同之处,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。C 的语法首先,先看看 C 的语法。C 采用了一种聪明而不同寻常的声明语法。声明变量时,只需写出一个...
    99+
    2023-06-16
  • JavaScript Babel 揭秘:实现语言跨平台兼容的奥秘
    JavaScript Babel 是一个尖端的编译器,旨在桥接 JavaScript 语言和不同平台之间的兼容性鸿沟。它将现代 JavaScript 代码转换为更旧版本,使它们可以在不支持最新特性的旧浏览器和环境中运行。 工作原理 Bab...
    99+
    2024-04-02
  • go语言是不是后端语言
    今天小编给大家分享一下go语言是不是后端语言的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。go语言是后端语言。go语言是服务...
    99+
    2023-07-04
  • go语言是不是动态语言
    这篇文章主要介绍了go语言是不是动态语言的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言是不是动态语言文章都会有所收获,下面我们一起来看看吧。go不是动态语言。go语言是Google开发的一种静态强类型、...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作