在Go包里添加C代码并且不使用CGO(不需要gcc)
如果go代码里使用了cgo,那么编译的时候电脑上必须按照gcc才能正确编译
这篇文章展示了如何用c写一个包让go调用并且不需要使用cgo
A 需要注意的:
1. C代码天生的不安全
2. Go1的兼容性保证不包括C代码
3. C函数不能inline
4. 逃逸分析不能跟踪传递到C函数里的value (逃逸分析:http://kenwublog.com/jvm-optimization-escape-analysis)
5. C编译器(5c,6c,8c)没有对应的Go编译器优化做的好,因此生成的代码也许没有Go代码优化的那么好
6. C代码是plan9风格的,与C89较相似
B 返回的方式
第一个例子是一个简单的返回true的函数:True
// Max returns the maximum of two integers.func Max(a, b int) int
前面两个例子,我们传递两个参数给函数并且把拷贝通过堆栈返回。Go的函数调用是值传递,调用C函数也是如此
最后一个例子我们将传递某个变量的指针给C函数,并通过指针改变这个值
1.双击env.cmd,以下命令都是在弹出的窗口里输入的2.测试:go test -v ccode输出:=== RUN TestTrue--- PASS: TestTrue (0.00 seconds)=== RUN TestMax--- PASS: TestMax (0.00 seconds)=== RUN TestInc--- PASS: TestInc (0.00 seconds)PASSok ccode 0.255s3.安装ccode库:go install ccode4.编译:go build main5.运行:main.exe