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札记的更多相关文章

  1. Golang 调用 Python 代码

    go 中的 cgo 模块可以让 go 无缝调用 c 或者 c++ 的代码,而 python 本身就是个 c 库,自然也可以由 cgo 直接调用,前提是指定正确的编译条件,如 Python.h 头文件( ...

  2. 如何实现 javascript “同步”调用 app 代码

    在 App 混合开发中,app 层向 js 层提供接口有两种方式,一种是同步接口,一种一异步接口(不清楚什么是同步的请看这里的讨论).为了保证 web 流畅,大部分时候,我们应该使用异步接口,但是某些 ...

  3. 1.JAVA中使用JNI调用C++代码学习笔记

    Java 之JNI编程1.什么是JNI? JNI:(Java Natibe Inetrface)缩写. 2.为什么要学习JNI?  Java 是跨平台的语言,但是在有些时候仍然是有需要调用本地代码 ( ...

  4. 股票数据调用示例代码php

    <!--?php // +---------------------------------------------------------------------- // | JuhePHP ...

  5. 在HTML标签<a/>中调用javascript代码

    <a/>标签的“href”属性可以是一个有效的URL,表示跳转的目的地,除此之外,href还可以是一段javascript代码.当为“href”设置javascript代码时,格式如下:& ...

  6. 在Java中直接调用js代码(转载)

    http://blog.csdn.net/xzyxuanyuan/article/details/8062887 JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Ja ...

  7. java调用python代码

    同样的我们需要安装jython,具体的步骤如下: 1. 去 http://sourceforge.net/projects/jython/ 下载最新的jython相关的jar包. 2. 下载下来的ja ...

  8. Matlab与C/C++联合编程之Matlab以MEX方式调用C代码(五)完整过程加示

    如下为本人亲证代码: 一: 编译器的安装与配置(环境不同,显示结果不同) 要使用MATLAB编译器,用户计算机上应用事先安装与MATLAB适配的以下任何一种ANSI C/C++编译器: 5.0.6.0 ...

  9. 在Java中直接调用js代码

    JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Java中直接调用js代码 不能调用浏览器中定义的js函数,会抛出异常提示ReferenceError: “alert ...

随机推荐

  1. 有引用外部jar包时(J2SE)生成jar文件

    一.工程没有引用外部jar包时(J2SE) 选中工程---->右键,Export...--->Java--->选择JAR file--->next-->选择jar fil ...

  2. spring注解关键字

    spring注解: (1)@Controller   控制器 (2)@Autowired    按照类型匹配,可以完成对类成员变量,方法及构造函数进行标注,完成自动装配的工作   @Autowired ...

  3. 用shell脚本挂载linux主机拷贝相应文件

    #!/bin/sh TARGETIP=192.168.88.3 #这里是你要挂在的ftp服务器的IP地址 MOUNTDIR=/mnt TARGETDIR=/root/Desktop/Work ERRO ...

  4. 关于Mac中PATH环境变量可能会被修改的几个地方

    一个是全局的profile文件,位置在/etc/profile中:另一个和用户无关的全局位置在/etc/paths.d目录中: apple@kissAir: paths.d$pwd /etc/path ...

  5. ELF 文件 动态链接 - 地址无关代码(GOT)

    Linux 系统中,ELF动态链接文件被称为 动态共享对象(DSO,Dynamic Shared Object),简称共享对象 文件拓展名为".so" 动态链接下 一个程序可以被分 ...

  6. Windows平台安装及配置Hadoop(不借助cygwin)

    由于项目需要,我在VMware上装了几个虚拟机Windows server 2012 R2,并要搭建Hadoop集群.刚刚入门hadoop,一头雾水,然后开始搜各种教程,首先是选用cygwin进行安装 ...

  7. BAT面试技巧

    很多人都质疑面试前去google一下面试题,是否有用....其实真实情况往往是这样:前台告诉经理,有个面试者来了,经理一拍头:啊!差点忘了!拿起电话:小谢,你有空吧,帮忙面个试! 小谢答应后,goog ...

  8. python笔记--2--字符串、正则表达式

    字符串 ASCII码采用1个字节来对字符进行编码,最多只能表示256个符号. UTF-8以3个字节表示中文 GB2312是我国制定的中文编码,使用1个字节表示英语,2个字节表示中文:GBK是GB231 ...

  9. Day14 Javascript 点击添加出弹窗,取消隐藏弹窗小练习 反选,全选,取消边框

    点击添加出弹窗,取消隐藏弹窗小练习 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta ...

  10. SVN中与资源库同步时报告了错误。1 中的 0 个资源已经同步

    SVN中与资源库同步时报告了错误.1 中的 0 个资源已经同步 原因: 文件被lock, 此时再次提交则出错,解决办法就是clean释放锁即可再次提交: 解决方案: 右键项目–>team–> ...