C语言?Go语言?还是CGO语言!

发布时间:2017-6-29 10:42:18编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"C语言?Go语言?还是CGO语言!",主要涉及到C语言?Go语言?还是CGO语言!方面的内容,对于C语言?Go语言?还是CGO语言!感兴趣的同学可以参考一下。

Cgo让Go包调用C代码。给出一个Go源文件,用一些特殊功能编写,cgo输出Go和C文件,可以组合成一个Go包。

为了与以身作则,这里有一个go包,提供了两个功能- RandomSeed-那套C'S randomsrandom功能。

package rand
/ *#include <stdlib.h>* /import“C”func Random()int { return int(C.random())}func Seed(i int){ C.srandom(C.uint(i))的}

我们来看看这里发生了什么,从import语句开始。

rand包导入"C",但您会发现标准Go库中没有这样的包。这是因为C是一个“伪包”,一个由cgo解释为C名称空间的引用的特殊名称。

rand包包含四个包的引用C:对C.randomC.srandom,转换C.uint(i)import语句的调用。

Random函数调用标准C库random函数并返回结果。在C中,random返回C类型的值long,cgo表示为类型C.long。它必须转换为Go类型,才能使用Go程序外的Go代码,使用普通的Go类型转换:

func Random()int {
    return int(C.random())
}

这是一个等效的函数,它使用临时变量来更明确地说明类型转换:

func Random()int {
    var r C.long = C.random()
    返回int(r)
}

Seed在某种程度上, 该功能相反。它需要一个常规的Go int,将其转换为C unsigned int类型,并将其传递给C函数srandom

func Seed(i int){
    C.srandom(C.uint(i))的
}

注意,cgo知道unsigned int类型为C.uint; 请参阅cgo文档以获取这些数字类型名称的完整列表。

我们尚未审查的这个例子的一个细节是import声明之上的评论。

/ *
#include <stdlib.h>
* /
import“C”

Cgo认识到这个评论。任何从#cgo空格字符开始的行都将被删除; 这些成为cgo的指令。当编译包的C部分时,其余的行用作标题。在这种情况下,这些行只是一个单独的#include语句,但它们几乎可以是任何C代码。这些#cgo指令用于在构建包的C部分时为编译器和链接器提供标志。

有一个限制:如果你的程序使用任何//export指令,那么注释中的C代码只能包含声明(extern int f();),而不是定义(int f() { return 1; })。您可以使用//export指令使Go函数可访问C代码。

#cgo//export指令都记录中CGO文件

字符串和东西

与Go不同,C没有显式的字符串类型。C中的字符串由零终止的字符数组表示。

围棋和C字符串之间的转换与完成C.CStringC.GoString以及C.GoStringN功能。这些转换会产生字符串数据的副本。

下一个示例实现了Print使用库中的C fputs函数将字符串写入标准输出的函数stdio

package print

// #include <stdio.h>
// #include <stdlib.h>
import“C”
import "unsafe"
func打印(s字符串){ cs:= C.CString(s) C.fputs(cs,(* C.FILE)(C.stdout)) C.free(unsafe.Pointer(CS))}

Go的内存管理器不知道由C代码创建的内存分配。当您使用C.CString(或任何C内存分配)创建C字符串时,您必须记住通过调用完成它才能释放内存C.free

调用C.CString返回一个指向char数组开头的指针,所以在函数退出之前,我们将它转​​换为一个unsafe.Pointer释放内存分配C.free。cgo程序中的常见成语是defer在分配后立即释放(特别是当以下代码比单个函数调用更复杂时),如以下重写Print

func打印(s字符串){
    cs:= C.CString(s)
    推迟C.free(unsafe.Pointer(cs))
    C.fputs(cs,(* C.FILE)(C.stdout))
}

构建cgo包

要构建cgo包,只需使用go buildgo install照常使用。go工具识别特殊"C"导入,并自动使用这些文件的cgo。

更多的cgo资源

CGO命令文件具有关于C伪包和构建过程的更多细节。该CGO例子中转到树演示更高级的概念。

最后,如果您对所有内容的内部操作感到好奇,请查看运行时包cgocall.go介绍性注释

作者:Andrew Gerrand

相关文章


上一篇:acm基础-
下一篇:Java开发中的23种设计模式详解---

相关文章

关键词: C语言?Go语言?还是CGO语言!

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

最近更新

好贷网好贷款