1. 在Go中引用C代码很简单, 在 import "C"前用注释引入标准的C代码, 然后使用C.xxx的伪包引用C代码空间的标识符即可. 需要注意, import"C"是伪package,不能与其他package一块定义为import (..."C"...)

2. 在Go中引用C代码必须手工释放C代码对象. 释放方法为C.free(unsafe.Pointer(xxx)), 这也要求C代码包含#include <stdlib.h>

3. 必须深入理解下述:

(1) Cgo recognizes this comment above import "C" statement.

(2) Any lines starting with #cgo followed by a space character are removed; these become directives for cgo.

(3) The remaining lines are used as a header when compiling the C parts of the package.

------------------------------------

通俗记忆:

(1)cgo能够识别import "C" 语句的注释.

(2)#cgo行用作cgo指令

(3)其他行用作C头文件

第(2)点很关键! 容易导致重复定义.

实践问题:

代码段1:

-------------------------------

package main

/*

#include <stdlib.h>

#include "prints.h"

*/

import "C"

import (

"fmt"

"unsafe"

)

func main() {

msg := "this is a test for"

cmsg := C.CString(msg)

defer C.free(unsafe.Pointer(cmsg))

C.prints(cmsg)

fmt.Println("done...")

}

//在main包中引入C代码, 使用go run xxx.go会报错. 先go build-->再执行, 无错误.

-------------------------------------

上面解决办法,是定义wrapper把C代码封装起来. 例如:

package myc

/*

#include <stdlib.h>

#include "prints.h"

*/

import "C"

import "unsafe"

func Cprints(msg string) {

cmsg := C.CString(msg)

defer C.free(unsafe.Pointer(cmsg))

C.prints(cmsg)

}

-------------------------------------------------

golang与C交互:cgo的更多相关文章

  1. Go语言练习:go语言与C语言的交互——cgo

    1.代码 package main import "fmt" /* #include <stdlib.h> #include <stdio.h> void ...

  2. golang cgo 使用总结

    原文地址 CGO 提供了 golang 和 C 语言相互调用的机制.某些第三方库可能只有 C/C++ 的实现,完全用纯 golang 的实现可能工程浩大,这时候 CGO 就派上用场了.可以通 CGO ...

  3. C/C++调用Golang 二

    C/C++调用Golang 二 <C/C++调用Golang 一>简单介绍了C/C++调用Golang的方法步骤,只涉及一个简单的函数调用.本文总结具体项目中的使用场景,将介绍三种较复杂的 ...

  4. 【Go命令教程】13. go tool cgo

    cgo 也是一个 Go 语言自带的特殊工具.一般情况下,我们使用命令 go tool cgo 来运行它.这个工具可以使我们创建能够调用 C 语言代码的 Go 语言源码文件.这使得我们可以使用 Go 语 ...

  5. 15. Go 语言“避坑”与技巧

    Go 语言"避坑"与技巧 任何编程语言都不是完美的,Go 语言也是如此.Go 语言的某些特性在使用时如果不注意,也会造成一些错误,我们习惯上将这些造成错误的设计称为"坑& ...

  6. 10 Go 1.10 Release Notes

    Go 1.10 Release Notes Introduction to Go 1.10 Changes to the language Ports Tools Default GOROOT &am ...

  7. 【Go命令教程】14. go env

    命令 go env 用于打印 Go 语言的环境信息.其中的一些信息我们在之前已经多次提及,但是却没有进行详细的说明.在本小节,我们会对这些信息进行深入介绍.我们先来看一看 go env 命令情况下都会 ...

  8. C/C++ cmake example

    学习 Golang,有时需要 Cgo,所以需要学习 C.C++. 语言入门: https://item.jd.com/12580612.html https://item.jd.com/2832653 ...

  9. cgo 随笔(golang)

    结构体应用 //结构体定义如下 // test.h struct test { int a; int b; int c; } 在golang中的调用如下: package name import &q ...

随机推荐

  1. Android基础总结(10)——手机多媒体的运用:通知、短信、相机、视频播放

    Android提供了一系列的API,是我们可以在程序中调用很多手机的多媒体资源,从而编写出更加丰富的应用程序. 1.通知的使用 通知(Notification)是Android中比较有特色的一个功能, ...

  2. linx 实用操作命令一

    如果apache安装成为linux的服务的话,可以用以下命令操作:service httpd start 启动service httpd restart 重新启动service httpd stop ...

  3. call函数心得

    今天深深受项目组一老大哥深深的鄙视了一把,在用call的时候,因不理解导致函数之间无法正常调用 function A(){ B.call(XXX,a,b,c); }; function B(a,b,c ...

  4. WWF3常用类 <第十一篇>

    一.WorkflowRuntime类 System.Workflow.Runtime.WorkflowRuntime是工作流的运行引擎.WorkflowRuntime在宿主中以自己独立的线程运行,它可 ...

  5. hdu1864

    use the cnt as the limit. #include <string.h> #include <stdio.h> ],sum; ]; double a,b,c; ...

  6. 理解inode

    转载:阮一峰 http://www.ruanyifeng.com/blog/2011/12/inode.html 一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最 ...

  7. ubuntu 12.04 64位设置兼容32位的实现

    在ubuntu12.04上,要运行32的程序,需要安装32位的兼容库. 以前在10.04上成功安装过,方法是 sudo apt-get install ia32-libs 但是在12.04上遇到了困难 ...

  8. Retrieve Only First x Rows

    From time to time you may have the need to grab the top X number of rows returned from a table. For ...

  9. nginx的rewrite,gzip,反向代理学习笔记

    rewrite模块名:ngx_http_rewrite_module默认自动被编译 指令:rewrite regex replacement [flag] regex :正则表达式,用于匹配用户请求的 ...

  10. zabbix介绍

    zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix组件主要分两个: zabbix-server和zabbix-agent.支持的监控协议有ICM ...