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. 【uWSGI】实战之Django配置经验

    uWSGI 是应用服务器,实现了uwsgi, wsgi等协议,可以运行wsgi 应用 uwsgi 是协议名 Django配置 下面是自己经常用的一个配置模板,基于1.9以上的版本使用的, 主要基于dj ...

  2. gdb中的define命令

    可以使用define命令达到类似于display的效果:比如每ni后显示当前5条指令: define s5 ni x/5i $pc end 甚至可以手动传入要显示指令的条数: define s ni ...

  3. ruby写一个文件内容相似性比较的代码

    1.相似度定义 我们定义,则,我们设,则,|C|=s,则相似度p=,p(0,1) 2.相似度检测算法设计 算法设计: 定义4个字符为一个字符串,将T1,T2分割成若干字符串,若剩余字符不足4个,则以空 ...

  4. iOS 字体权重weight

    UIFontWeightUltraLight  - 超细字体 UIFontWeightThin  - 纤细字体 UIFontWeightLight  - 亮字体 UIFontWeightRegular ...

  5. time元素与微格式/pubdate属性

    首先来说下微格式,它是一种利用HTML的class属性来对网页添加诸如新闻事件发生的日期和时间.个人电话号码.企业邮箱之类的附加信息方法. time元素代表24小时中的某个时刻或某个日期,表示时刻时允 ...

  6. ACCA AI来袭会议笔记

    ACCA AI来袭会议笔记 Technology in Accounting 调研报告: http://cn.accaglobal.com/news/professional_report.html ...

  7. Django Web项目代码规范参考

    Python:PEP8+GoogleStyle+DjangoSytlePEP8中文版:http://www.cnblogs.com/huazi/archive/2012/11/28/2792929.h ...

  8. 用python抓取智联招聘信息并存入excel

    用python抓取智联招聘信息并存入excel tags:python 智联招聘导出excel 引言:前一阵子是人们俗称的金三银四,跳槽的小朋友很多,我觉得每个人都应该给自己做一下规划,根据自己的进步 ...

  9. Centos下部署Flask

    尝试在Centos6.5下部署Flask应用并成功,记录一下步骤,参数为什么这样配置还需要再研究uwsgi和Nginx才能回答. Python版本升级2.7 测试机器centos6.5默认自带的pyt ...

  10. 七个人生工具:SWOT、PDCA、6W2H、SMART、WBS、时间管理、二八原则

    本文为转载 心理导读:今天为大家分享几个实用的工具,来源网络. SWOT分析法 Strengths:优势 Weaknesses:劣势 Opportunities:机会 Threats:威胁 意义:帮您 ...