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. linux使用flock文件锁解决crontab冲突问题

    * * * * * flock -xn /dev/shm/redis.lock -c "/usr/local/bin/redis-server" 可以用flock命令,配合使用rs ...

  2. 25_android下文件访问的权限

    写文件:FileOutputStream fos = 上下文.openFileOutput("private.txt",Context.MODE_PRIVATR);参数1 文件名, ...

  3. sql server分页

    表结构 CREATE TABLE v_home ( vid int IDENTITY(1,1) not null,-- AUTO_INCREMENT, chapter varchar(20) not ...

  4. git大百科

    1,命令: git忽略提交文件:git rm --cache .idea/workspace.xml 因为你已经把他加到tracked file里了 用 git rm --cached java/.i ...

  5. Mac OS X Server 安装与应用

    Mac OS X Server 安装与应用 Mac OS X Server是苹果电脑公司新一代服务器软件.专为OS X和iOS设备.Mac OS X提供服务,现在支持Mavericks,能够轻松共享文 ...

  6. python urllib urllib2

    区别 1) urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL.这意味着,用urllib时不可以伪装User Agent字符串等. 2) u ...

  7. vs 异常处理

    解决方法: 4.0 删除 C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files 2..0 删除 C:/WINDOW ...

  8. React 初探

    React 简单介绍 先说 React 与 React Native 他们是真的亲戚,可不像 Java 和 Javascript 一样. 其实第一次看到 React 的语法我是拒绝的,因为这么丑的写法 ...

  9. 使用SE16N_INTERFACE

    调用函数直接修改table数据             在PRD上通常没有权限 但是可以激活sap内置的修改模式     SE16N 修改表数据.增加.删除行项目: 1. Execute tcode ...

  10. 必须会的SQL语句(一) 创建数据库与删除数据库

    1.创建数据库   Create database 名称 on primary {    name ='名称',    filename ='c:\xx\名称.mdf',    size = 10mb ...