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. iis 站点部署后 Microsof .Net Framework异常

    最近在部署站点到 iis 中时,遇到 iis 崩溃的问题,一打开部署好 的站点后,就出现 Microsoft .Net Framework 异常的消息提示,具体的 异常情况如下: 于是在网上查找了很多 ...

  2. 洛谷P1198 [JSOI2008]最大数

    P1198 [JSOI2008]最大数 267通过 1.2K提交 题目提供者该用户不存在 标签线段树各省省选 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 WA80的戳这QwQ BZOJ都 ...

  3. 从零开始安装Hadoop视频教程

    从零开始安装Hadoop视频教程 Hadoop 是一个能够对大量数据进行分布式处理的软件框架,用这种技术使得普通的PC服务器甚至一些近过时的服务器也能够发挥余热,组成大型集群系统,由于它的可伸缩性能够 ...

  4. Dynamic AX 4.0 用户组权限SecurityKey

    UserId _userId = "IT001"; UserGroupId _userGroupId = "ABC_1"; DomainId _domainId ...

  5. jQuery之Nestable

    空间属性置顶: 属性 说明 change 事件,当控件改变时触发 nestable 方法,获取顺序JSON数据,形式如下: [{"id":1},{"id":2} ...

  6. DataGridview焦点不移开不保存数据问题

    this.datagridLeft.ClearSelection();                this.datagridLeft.Refresh();                this. ...

  7. Loadrunner:场景中添加负载生成器

    场景中添加负载生成器: (1)远程机子(假设ip为192.168.134.23)开启负载生成器 开始菜单找到:LoadRunner Agent Process 开启后任务栏会显示如下图: (2)场景中 ...

  8. 为Magento2新主题添加使用Grunt

    Go to \dev\tools\grunt\configs, open your themes.js file, and change it according to the following e ...

  9. 调试时屏蔽JavaScript库代码 –Chrome DevTools Blackbox功能介绍

    代码难免会有Bug,每次我们在Chrome调试代码时,总是会进入各种各样的库代码(比如jQuery.Zepto),但实际上很多时候我们并不希望这样,要是能把这些库代码“拉黑”多好啊. 广大码农喜闻乐见 ...

  10. Android IOS WebRTC 音视频开发总结(二十)-- 自由职业

    咋看标题感觉与WebRTC和音视频无关,其实有着很大的关联,文章来自博客园RTC.Blacker,转载请说明出处. 背景: 一方面因为对开发人员比较了解,不喜欢约束,喜欢自由自在,所以我们向往自由职业 ...