资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

go语言代码转c语言 c语言转golang

如何在golang 中调用c的静态库或者动态库

Cgo 使得Go程序能够调用C代码. cgo读入一个用特别的格式写的Go语言源文件, 输出Go和C程序, 使得C程序能打包到Go语言的程序包中.

创新互联致力于互联网品牌建设与网络营销,包括成都网站设计、网站制作、SEO优化、网络推广、整站优化营销策划推广、电子商务、移动互联网营销等。创新互联为不同类型的客户提供良好的互联网应用定制及解决方案,创新互联核心团队10多年专注互联网开发,积累了丰富的网站经验,为广大企业客户提供一站式企业网站建设服务,在网站建设行业内树立了良好口碑。

举例说明一下. 下面是一个Go语言包, 包含了两个函数 -- Random 和 Seed -- 是C语言库中random和srandom函数的马甲.

package rand

/*

#include stdlib.h

*/ import "C" func Random() int { return int(C.random()) } func Seed(i int) { C.srandom(C.uint(i)) }

我们来看一下这里都有什么内容. 开始是一个包的导入语句.

rand包导入了"C"包, 但你会发现在Go的标准库里没有这个包. 那是因为C是一个"伪包", 一个为cgo引入的特殊的包名, 它是C命名空间的一个引用.

rand 包包含4个到C包的引用: 调用 C.random和C.srandom, 类型转换 C.uint(i)还有引用语句.

Random函数调用libc中的random函数, 然后回返结果. 在C中, random返回一个C类型的长整形值, cgo把它轮换为C.long. 这个值必需转换成Go的类型, 才能在Go程序中使用. 使用一个常见的Go类型转换:

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

这是一个等价的函数, 使用了一个临时变量来进行类型转换:

func Random() int { var r C.long = C.random() return 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的文档中有完整的类型列表.

这个例子中还有一个细节我们没有说到, 那就是导入语句上面的注释.

/*

#include stdlib.h

*/ import "C"

Cgo可以识别这个注释, 并在编译C语言程序的时候将它当作一个头文件来处理. 在这个例子中, 它只是一个include语句, 然而其实它可以是使用有效的C语言代码. 这个注释必需紧靠在import "C"这个语句的上面, 不能有空行, 就像是文档注释一样.

Strings and things

与Go语言不同, C语言中没有显式的字符串类型. 字符串在C语言中是一个以0结尾的字符数组.

Go和C语言中的字符串转换是通过C.CString, C.GoString,和C.GoStringN这些函数进行的. 这些转换将得到字符串类型的一个副本.

下一个例子是实现一个Print函数, 它使用C标准库中的fputs函数把一个字符串写到标准输出上:

package print // #include stdio.h // #include stdlib.h import "C" import "unsafe" func Print(s string) { cs := C.CString(s) C.fputs(cs, (*C.FILE)(C.stdout)) C.free(unsafe.Pointer(cs)) }

在C程序中进行的内存分配是不能被Go语言的内存管理器感知的. 当你使用C.CString创建一个C字符串时(或者其它类型的C语言内存分配), 你必需记得在使用完后用C.free来释放它.

调用C.CString将返回一个指向字符数组开始处的指错, 所以在函数退出前我们把它转换成一个unsafe.Pointer(Go中与C的void 等价的东西), 使用C.free来释放分配的内存. 一个惯用法是在分配内存后紧跟一个defer(特别是当这段代码比较复杂的时候), 这样我们就有了下面这个Print函数:

func Print(s string) { cs := C.CString(s) defer C.free(unsafe.Pointer(cs)) C.fputs(cs, (*C.FILE)(C.stdout)) }

构建 cgo 包

如果你使用goinstall, 构建cgo包就比较容易了, 只要调用像平常一样使用goinstall命令, 它就能自动识别这个特殊的import "C", 然后自动使用cgo来编译这些文件.

如果你想使用Go的Makefiles来构建, 那在CGOFILES变量中列出那些要用cgo处理的文件, 就像GOFILES变量包含一般的Go源文件一样.

rand包的Makefile可以写成下面这样:

include $(GOROOT)/src/Make.inc

TARG=goblog/rand

CGOFILES=\ rand.go\ include $(GOROOT)/src/Make.pkg

然后输入gomake开始构建.

更多 cgo 的资源

cgo的文档中包含了关于C伪包的更多详细的说明, 以及构建过程. Go代码树中的cgo的例子给出了更多更高级的用法.

一个简单而又符合Go惯用法的基于cgo的包是Russ Cox写的gosqlite. 而Go语言的网站上也列出了更多的的cgo包.

最后, 如果你对于cgo的内部是怎么运作这个事情感到好奇的话, 去看看运行时包的cgocall.c文件的注释吧.

go语言能取代C语言吗?

不能吧,现在用C语言搞开发都是用在更加底层的开发中,更加底层的开发需要高运行效率,go语言的运行效率是比不上C语言的,所以go语言在这些方面还无法取代C语言。应该说是各有所长吧,go和C都有它们自己的适用环境,谁也不能取代谁。

使用go语言还需要写c语言代码吗

某语言是否会替代另一种语言,是要看使用场景的。

如果说全面替代,确实如前所说至少短期内不会,除非Google或者第三方愿意实现一个Go芯片之类的,短期内可以期待的是ChromeOs对Go的依赖和支持,是否会向Qt之于Linux桌面一样。

但是Go的使用场景跟C的使用场景并不完全一致,它的出现并不是为了取消某种语言,而是为了加速、简化并行编程、服务开发,以及增加很多C、C++这种底层语言所难以支持的语言特性,让开发更有人性化。在这一点上,Go是有可能取代C的。

c转golang好找工作吗

好。c转golang是好找工作的,生活中缺少其工程师。Go语言是类C的语言,与C语言有着千丝万缕的联系,在Go语言的代码中可以直接调用C语言代码,但不支持直接调用C加加。

Go语言可能会代替C语言吗

不可能。Go到目前为止,其本身就是用C写的。只是在语言层面实现了一些如果用C会很难写的feature,比如goroutine。在1.5版本中,Go会bootstraping,用Go来编译自己。

C语言,几乎每种操作系统的系统调用都是C,C最大的作用就是用来实现新的语言。

go 语言可以写C/s程式语言吗?我看到都是web程式设计也就是B/S

go 语言可以写C/s程式语言吗?我看到都是web程式设计也就是B/S

语言只是工具而已,有的适合做哪一方面。

一般来说高阶语言除了写底层的东西,什么都能做。

go语言听说过但不了解

我想应该像python ruby一样吧

拿python来说,可以写web,可以写socket,资料库,game,图形介面,你去官网看看他能做什么在右边的最下面有,几乎什么都能做。

所以go语言开发cs架构肯定是可以的,不知道适合不适合。

要编写B/S和C/S之类的程式应该学习什么程式语言

如果想B/S,C/S通吃的话建议C#

如果对C/S外面,效率没要求的话就入Java

如果时间多,入C++,Java

叙述b/s程式设计模式javascript语言

JavaScript一种直译式指令码语言,是一种动态型别、弱型别、基于原型的语言,内建支援型别。它的直译器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的指令码语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。

c/c++语言程式设计问题?

C语言之所以要起名为“C”,是因为它是主要参考那个时候的一门叫B的语言,它的设计者认为C语言是B语言的进步,所以就起名为C语言;但是B语言并不是因为之前还有个A语言,而是B语言的作者为了纪念他的妻子,他的妻子名字的第一个字母是B; 当C语言发展到顶峰的时刻,出现了一个版本叫C with Class,那就是C++最早的版本,在C语言中增加class关键字和类,那个时候有很多版本的C都希望在C语言中增加类的概念;后来C标准委员会决定为这个版本的C起个新的名字,那个时候征集了很多种名字,最后采纳了其中一个人的意见,以C语言中的++运算子来体现它是C语言的进步,故而叫C++,成立了C++标准委员会。 美国ATT贝尔实验室的本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)博士在20世纪80年代初期发明并实现了C++(最初这种语言被称作“C with Classes”)。一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚拟函式(virtual function)、运算子过载(operator overloading)、多重继承(multiple inheritance)、模板(template)、异常(exception)、RTTI、名称空间(name space)逐渐被加入标准。1998年国际标准组织(ISO)颁布了C++程式设计语言的国际标准ISO/IEC 1488-1998。C++是具有国际标准的程式语言,通常称作ANSI/ISO C++。1998年是C++标准委员会成立的第一年,以后每5年视实际需要更新一次标准,下一次标准更新原定是在2009年,目前我们一般称该标准C++0x,但是由于对于新特性的争端激烈,除了在Technical Report 1(tr1)中的新增修改被基本确定外,完整的标准还遥遥无期。况且遗憾的是,由于C++语言过于复杂,以及经历了长年的演变,直到现在(2010年)都没有有一个编译器完全符合这个标准。 目前最符合和接近C++标准的编译器有为 GNU GCC 4.5.0 和 Visual Studio 2010 等。 另外,就目前学习C++而言,可以认为他是一门独立的语言;他并不依赖C语言,我们可以完全不学C语言,而直接学习C++。根据《C++程式设计思想》(Thinking in C++)一书所评述的,C++与C的效率往往相差在正负5%之间。所以有人认为在大多数场合C++ 完全可以取代C语言(然而我们在微控制器等需要谨慎利用空间、直接操作硬体的地方还是要使用C语言)。

网路程式语言就是指不是程式设计EXE档案的语言吗

不是

原则上任何可以编写网路通讯程式的语言都可以用来编写网页

c/perl--cgi(cgi可以用任何语言编写,windows常用c;unix常用perl)

vb--asp

java--jsp

dephi--intraweb

所以“网路程式语言就是指不是程式设计EXE档案的语言”说法是不对的

快速开发工具哪个比较好?支援B/S和C/S,并最好可以支援2种以2种语言程式语言以上的。

推荐使用微软的 virsual stdio系列的,比如VS2010 VS2015等等,功能很强悍,支援C/S和B/S的开发,支援多种程式语言。

程式语言都是免费的么?

语言当然是免费的,程式设计软体就不是都免费的了。。

github 支援什么程式语言 ,就是在github上可以用什么程式语言建立专案

什么语言都可以,只是一个版本管理库。和语言关系不大。

你可以用它来管理一个图片的版本都可以

github is really really useful

swift 程式语言

用的xcode;

AE程式语言

AE的指令码和表示式的基础都是JavaScript程式语言,因此AE表示式语句直接继承了Java的数学函式。


网站栏目:go语言代码转c语言 c语言转golang
文章分享:http://cdkjz.cn/article/hpoodg.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220