Go调用C代码,Cgo札记
http://www.myexception.cn/program/679738.html
Go调用C代码,Cgo笔记
参考:
官方文档:
http://golang.org/cmd/cgo/
http://blog.golang.org/2011/03/c-go-cgo.html
一份博文,编译过程讲得比较细:
http://googollee.blog.163.com/blog/static/1159411201031812128593/
Go语言教程:使用C语言函数:
http://chaishushan.blog.163.com/blog/static/130192897201012710273283/
看完上面的教程,基本上知道怎么用Go调用C代码、和需要注意的事项。
至于C调用Go的代码,Go调用汇编代码,以后再研究吧。
以下内容是笔记,列出一些重点等,不解释。
源文件
/*
// 这是注释中的注释
#include <stdio.h>
#include <errno.h>
*/
import "C"
// #cgo CFLAGS: -DPNG_DEBUG=1
// #cgo linux CFLAGS: -DLINUX=1
// #cgo LDFLAGS: -lpng
// #include <png.h>
import "C"
// #cgo pkg-config: png cairo
// #include <png.h>
import "C"
编译方法
include $(GOROOT)/src/Make.inc TARG=xdb
CGOFILES=xdb.go CGO_CFLAGS+=-L/opt/xunsearch/lib/ -I/opt/xunsearch/include
CGO_LDFLAGS+=-lscws -L/opt/xunsearch/lib/ include $(GOROOT)/src/Make.pkg 说明:CFlags等参数,可以写在Go的源代码中
数据类型转换
C -> Go
int(C.int ) // C string to Go string
func C.GoString(*C.char) string // C string, length to Go string
func C.GoStringN(*C.char, C.int) string // C pointer, length to Go []byte
func C.GoBytes(unsafe.Pointer, C.int) []byte
Go -> C
C.char
C.schar (signed char)
C.uchar (unsigned char)
C.short
C.ushort (unsigned short)
C.int
C.uint (unsigned int)
C.long
C.ulong (unsigned long)
C.longlong (long long)
C.ulonglong (unsigned long long)
C.float
C.double. unsafe.Pointer (void*) // Go string to C string
func C.CString(string) *C.char var val []byte
(*C.char)(unsafe.Pointer(&val[0]))
内存释放
cs := C.CString(s)
defer C.free(unsafe.Pointer(cs))
Go创建的对象,可以很好的回收;而C创建的,则需要手动回收
注意事项:
不支持调用像 Printf()
不清楚的地方,问人,或者看别人用Go调用C的代码。
(待完善)
http://googollee.blog.163.com/blog/static/1159411201031812128593/
http://my.oschina.net/zengsai/blog/5138
http://my.oschina.net/zengsai/blog/5139
Go调用C代码,Cgo札记的更多相关文章
- Golang 调用 Python 代码
go 中的 cgo 模块可以让 go 无缝调用 c 或者 c++ 的代码,而 python 本身就是个 c 库,自然也可以由 cgo 直接调用,前提是指定正确的编译条件,如 Python.h 头文件( ...
- 如何实现 javascript “同步”调用 app 代码
在 App 混合开发中,app 层向 js 层提供接口有两种方式,一种是同步接口,一种一异步接口(不清楚什么是同步的请看这里的讨论).为了保证 web 流畅,大部分时候,我们应该使用异步接口,但是某些 ...
- 1.JAVA中使用JNI调用C++代码学习笔记
Java 之JNI编程1.什么是JNI? JNI:(Java Natibe Inetrface)缩写. 2.为什么要学习JNI? Java 是跨平台的语言,但是在有些时候仍然是有需要调用本地代码 ( ...
- 股票数据调用示例代码php
<!--?php // +---------------------------------------------------------------------- // | JuhePHP ...
- 在HTML标签<a/>中调用javascript代码
<a/>标签的“href”属性可以是一个有效的URL,表示跳转的目的地,除此之外,href还可以是一段javascript代码.当为“href”设置javascript代码时,格式如下:& ...
- 在Java中直接调用js代码(转载)
http://blog.csdn.net/xzyxuanyuan/article/details/8062887 JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Ja ...
- java调用python代码
同样的我们需要安装jython,具体的步骤如下: 1. 去 http://sourceforge.net/projects/jython/ 下载最新的jython相关的jar包. 2. 下载下来的ja ...
- Matlab与C/C++联合编程之Matlab以MEX方式调用C代码(五)完整过程加示
如下为本人亲证代码: 一: 编译器的安装与配置(环境不同,显示结果不同) 要使用MATLAB编译器,用户计算机上应用事先安装与MATLAB适配的以下任何一种ANSI C/C++编译器: 5.0.6.0 ...
- 在Java中直接调用js代码
JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Java中直接调用js代码 不能调用浏览器中定义的js函数,会抛出异常提示ReferenceError: “alert ...
随机推荐
- 有引用外部jar包时(J2SE)生成jar文件
一.工程没有引用外部jar包时(J2SE) 选中工程---->右键,Export...--->Java--->选择JAR file--->next-->选择jar fil ...
- spring注解关键字
spring注解: (1)@Controller 控制器 (2)@Autowired 按照类型匹配,可以完成对类成员变量,方法及构造函数进行标注,完成自动装配的工作 @Autowired ...
- 用shell脚本挂载linux主机拷贝相应文件
#!/bin/sh TARGETIP=192.168.88.3 #这里是你要挂在的ftp服务器的IP地址 MOUNTDIR=/mnt TARGETDIR=/root/Desktop/Work ERRO ...
- 关于Mac中PATH环境变量可能会被修改的几个地方
一个是全局的profile文件,位置在/etc/profile中:另一个和用户无关的全局位置在/etc/paths.d目录中: apple@kissAir: paths.d$pwd /etc/path ...
- ELF 文件 动态链接 - 地址无关代码(GOT)
Linux 系统中,ELF动态链接文件被称为 动态共享对象(DSO,Dynamic Shared Object),简称共享对象 文件拓展名为".so" 动态链接下 一个程序可以被分 ...
- Windows平台安装及配置Hadoop(不借助cygwin)
由于项目需要,我在VMware上装了几个虚拟机Windows server 2012 R2,并要搭建Hadoop集群.刚刚入门hadoop,一头雾水,然后开始搜各种教程,首先是选用cygwin进行安装 ...
- BAT面试技巧
很多人都质疑面试前去google一下面试题,是否有用....其实真实情况往往是这样:前台告诉经理,有个面试者来了,经理一拍头:啊!差点忘了!拿起电话:小谢,你有空吧,帮忙面个试! 小谢答应后,goog ...
- python笔记--2--字符串、正则表达式
字符串 ASCII码采用1个字节来对字符进行编码,最多只能表示256个符号. UTF-8以3个字节表示中文 GB2312是我国制定的中文编码,使用1个字节表示英语,2个字节表示中文:GBK是GB231 ...
- Day14 Javascript 点击添加出弹窗,取消隐藏弹窗小练习 反选,全选,取消边框
点击添加出弹窗,取消隐藏弹窗小练习 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta ...
- SVN中与资源库同步时报告了错误。1 中的 0 个资源已经同步
SVN中与资源库同步时报告了错误.1 中的 0 个资源已经同步 原因: 文件被lock, 此时再次提交则出错,解决办法就是clean释放锁即可再次提交: 解决方案: 右键项目–>team–> ...