最近在学习go。 看了一段时间后,发现其中有个cgo的命令,使得go语言程序可以调用c语言的函数。这个是很要用处的,因为现在的很多的大型程序都是用c写的,那么如果一下子转用go去重写无疑会加大工程量和成本。 下面就用一个简单的例子来演示怎么在go语言中调用c的函数:
//hello.go package hello // int Add(int a,int b) { // return a + b; // } import "C" import "fmt" func AddPrint(a int ,b int) { fmt.Println(C.Add(C.int(a),C.int(b))) }
要注意的是这个import "C"前面注释的代码就是c代码,当然也可以把它些在hello.c hello.h文件里面,并且把注释替换成 // #include "hello.h" 就可以拉,这里只是为了简单。 下面就是主程序的入口拉。
//main.go package main import "hello" func main(){ var a = 13 var b = 26 hello.AddPrint(a,b) }
关键在编译。
$8g -o _go_.8 hello.cgo1.go _cgo_gotypes.go $8c -FVw -I"$GOROOT/src/pkg/runtime" _cgo_defun.c $gopack grc _obj/hello.a _go_.8 _cgo_defun.8 $cp _obj/hello.a "$GOROOT/pkg/linux_386/hello.a" $gcc -m32 -fPIC -O2 -o hello.cgo2.o -c hello.cgo2.c $gcc -m32 -o _cgo_.so hello.cgo2.o -shared -lpthread -lm $cp _cgo_.so "$GOROOT/pkg/linux_386/hello.so" $8g main.go $8l -o main main.8 $rm hello.cgo2.c $./main 39
ok, 这里是通过动态链接库的形式链接c些的函数的 如果把hello.so删除点发现就无法运行了。
发现javaeye博客对chrome支持力度不够阿。