网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

go语言c互调 go与c++互相调用

程序员从c/c++转到Go语言怎么样?

从c

创新互联是一家专业提供安义企业网站建设,专注与成都网站建设、做网站、H5页面制作、小程序制作等业务。10年已为安义众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中。

c++转go语言,非常简单。需要了解的也就是语法问题。好在go语法也非常简练,不像python有非常多的语法糖。而且go有自带的资源回收机制,在多线程服务端开发方面,设计简单非常多。同时支持比线程更轻量级的携程,调用也非常简单。不像c语言创建线程进城语言参数复杂的系统调用。

go语言如何调用c函数

直接嵌入c源代码到go代码里面

package main

/*

#include stdio.h

void myhello(int i) {

printf("Hello C: %d\n", i);

}

*/

import "C"

import "fmt"

func main() {

C.myhello(C.int(12))

fmt.Println("Hello Go");

}

需要注意的是C代码必须放在注释里面

import "C"语句和前面的C代码之间不能有空行

运行结果

$ go build main.go ./main

Hello C: 12

Hello Go

分开c代码到单独文件

嵌在一起代码结构不是很好看,很多人包括我,还是喜欢把两个分开,放在不同的文件里面,显得干净,go源文件里面是go的源代码,c源文件里面是c的源代码。

$ ls

hello.c hello.h main.go

$ cat hello.h

void hello(int);

$ cat hello.c

#include stdio.h

void hello(int i) {

printf("Hello C: %d\n", i);

}

$ cat main.go

package main

// #include "hello.h"

import "C"

import "fmt"

func main() {

C.hello(C.int(12))

fmt.Println("Hello Go");

}

编译运行

$ go build ./main

Hello C: 12

Hello Go

编译成库文件

如果c文件比较多,最好还是能够编译成一个独立的库文件,然后go来调用库。

$ find mylib main

mylib

mylib/hello.h

mylib/hello.c

main

main/main.go

编译库文件

$ cd mylib

# gcc -fPIC -shared -o libhello.so hello.c

编译go程序

$ cd main

$ cat main.go

package main

// #cgo CFLAGS: -I../mylib

// #cgo LDFLAGS: -L../mylib -lhello

// #include "hello.h"

import "C"

import "fmt"

func main() {

C.hello(C.int(12))

fmt.Println("Hello Go");

}

$ go build main.go

运行

$ export LD_LIBRARY_PATH=../mylib

$ ./main

Hello C: 12

Hello Go

在我们的例子中,库文件是编译成动态库的,main程序链接的时候也是采用的动态库

$ ldd main

linux-vdso.so.1 = (0x00007fffc7968000)

libhello.so = ../mylib/libhello.so (0x00007f513684c000)

libpthread.so.0 = /lib64/libpthread.so.0 (0x00007f5136614000)

libc.so.6 = /lib64/libc.so.6 (0x00007f5136253000)

/lib64/ld-linux-x86-64.so.2 (0x000055d819227000)

理论上讲也是可以编译成整个一静态链接的可执行程序,由于我的机器上缺少静态链接的系统库,比如libc.a,所以只能编译成动态链接。

go语言中支持 有像C语言中union联合体吗

没有,union是很好的东西,但是go恐怕不会去支持。

毕竟union这个东西主要还是用于不降低速度下的节约内存,为此增加的复杂度。

go语言

不会支持的。

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

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

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


分享名称:go语言c互调 go与c++互相调用
标题网址:http://bjjierui.cn/article/doihcis.html

其他资讯