CGO编程基础快速入门

目录
  • 带你了解CGO编程
  • 快速入门
  • CGO基础
  • import "C" 语句

带你了解CGO编程

大学时最开始学的语言莫过于C/C++,C/C++经过几十年的发展,已经积累了庞大的软件资产,它们很多久经考验而且性能已经足够优化。Go语言则是站在巨人的肩膀之上而诞生,go也自带一个CGO的工具来支持C语言函数的调用,同时我们可以用GO语言导出C动态库接口给其他语言使用

快速入门

我们先通过一个简单的CGO程序来了解Go中的C

package main
import "C"
func main() {
	println("hello cgo")
}

代码通过 import "C" 语句启用CGO特性,同时包含C 语言的 头文件。然后通过CGO包的 C.CString 函 数将Go语言字符串转为C语言字符串,最后调用CGO包的 C.puts 函数向标准输出窗口打印转换后的C字符串。

相比“Hello, World 的革 命”一节中的CGO程序最大的不同是: 我们没有在程序退出前释放 C.CString 创建的C语言字符串; 还有我们改用 puts 函数直接向标准输出打印,之前是采用fputs向标准输出打印。

没有释放使用 C.CString 创建的C语言字符串会导致内存泄漏。但是对于这个小程序来说,这样是没有问题的,因为程序 退出后操作系统会自动回收程序的所有资源。

CGO基础

要使用CGO特性,需要安装C/C++构建工具链,在macOS和 Linux下是要安装GCC,在windows下是需要安装MinGW工具。同时需要保证环境变量 CGO_ENABLED 被设置为1,这表示 CGO是被启用的状态。在本地构建时 CGO_ENABLED 默认是启 用的,当交叉构建时CGO默认是禁止的。比如要交叉构建 ARM环境运行的Go程序,需要手工设置好C/C++交叉构建的 工具链,同时开启 CGO_ENABLED 环境变量。然后通过 import "C" 语句启用CGO特性。

import "C" 语句

如果在GO代码中出现 import "C" 则该go文件使用到了CGO特性,紧跟在这行语句前面的注释是一种特殊语法,里面包含正常的C语言代码

package main
//#include <stdio.h>
import "C"
/*
#include <stdio.h>
void hello(){
	printf("hello world!!! \n");
}
*/
func main() {
	C.hello()
}

这个例子展示了cgo的基本使用方法。开头的注释中写了要调 用的C函数和相关的头文件,头文件被include之后里面的所有 的C语言元素都会被加入到”C”这个虚拟的包中。需要注意的 是,import "C"导入语句需要单独一行,不能与其他包一同 import。向C函数传递参数也很简单,就直接转化成对应C语言 类型传递就可以。

cgo将当前包引用的C语言符号都放到了虚拟的C包中,同时通过虚拟的C包导入的C语言符号并不需要是大写字母开头,它们不受Go语言的导出规则约束。 cgo将当前包引用的C语言符号都放到了虚拟的C包中,同时当 前包依赖的其它Go语言包内部可能也通过cgo引入了相似的虚拟C包,但是不同的Go语言包引入的虚拟的C包之间的类型是不能通用的。这个约束对于要自己构造一些cgo辅助函数时有可能会造成一点的影响。

以上就是CGO编程基础快速入门的详细内容,更多关于CGO编程基础的资料请关注我们其它相关文章!

(0)

相关推荐

  • 浅谈go中cgo的几种使用方式

    目录 最简单的CGO程序 源码方式调用C函数 内部机制 编译和链接参数 编译参数:CFLAGS/CPPFLAGS/CXXFLAGS 链接参数:LDFLAGS 通过静态库的方式调用C函数 通过动态库的方式调用C函数 最简单的CGO程序 //cgo.go package main import "C" func main(){     println("hello cgo") } 上述代码是一个完整的CGO程序,通过import "C"语句启动了CG

  • Go语言中CGO的使用实践

    目录 1. Go语言调用C函数例子: 2. Go语言调用C库函数: 3. Go语言导出函数给C语言使用: 4. Go语言导出函数指针给c语言使用: 部门产品业务功能采用Golang开发,但是有些功能是用c写的,比如说net-snmp,bfd协议等等,像这些如果使用GO语言重编的话,既有实现的复杂度也需要相当长的时间,好在GO语言提供了CGO机制,使得能够在go代码中直接调用C的库函数,大大提高了效率,减少了重复开发工作,此外还支持在C语言中调用GO函数,这一点还是蛮强大的. 1. Go语言调用C

  • Go错误和异常CGO fallthrough处理教程详解

    目录 fallthrough 代码示例 执行结果 CGO 错误&异常 处理错误:error 处理异常:panic&recover panic&defer defer执行顺序 总结 对比Java.C++ 错误异常互相转换 fallthrough 在一个 switch 块内,每个 case 无需声明 break 来终止,如果想顺序执行使用fallthrough: 如果我们想强制执行满足条件case的后一个case,也可以通过设置fallthrough的方式: 代码示例 package

  • Golang使用CGO与Plugin技术运行加载C动态库

    目录 文章简介 技术背景 解决方案1 解决方案2 文章简介 本文介绍一种 Golang 程序在运行时加载 C 动态库的技术,跳过了 Golang 项目编译阶段需要链接 C 动态库的过程,提高了 Golang 项目开发部署的灵活性. 技术背景 Golang 程序调用 OpenCC 动态库的函数,执行文本繁体转简体操作. 需要在编译时不链接动态库,只在程序运行时加载 OpenCC 动态库. OpenCC 库是使用 C++ 编写的繁简体转换程序,提供 C 语言 API 接口. 开源项目地址 CGO 技

  • CGO编程基础快速入门

    目录 带你了解CGO编程 快速入门 CGO基础 import "C" 语句 带你了解CGO编程 大学时最开始学的语言莫过于C/C++,C/C++经过几十年的发展,已经积累了庞大的软件资产,它们很多久经考验而且性能已经足够优化.Go语言则是站在巨人的肩膀之上而诞生,go也自带一个CGO的工具来支持C语言函数的调用,同时我们可以用GO语言导出C动态库接口给其他语言使用 快速入门 我们先通过一个简单的CGO程序来了解Go中的C package main import "C"

  • MySQL基础快速入门知识总结(附思维导图)

    目录 前言 一.数据库基础知识 1.什么是数据库 2.数据库的分类 3.数据库的常用语言 4.数据库的常用操作方式 5.MySQL的架构 二.数据库的增删改查 1.创建数据库 2.查询数据库 3.修改数据库 4.删除数据库 三.表的增删改查 1.创建表 2.查询表 3.修改表 4.删除表 四.记录的增删改查 1.插入记录 2.查询记录(最常用) 3.修改记录 4.删除记录 五.字段类型 1.数字型 1.1整数型 1.2小数型 2.文本型 3.日期时间 六.字段属性 总结 前言 本文是我这段时间自

  • MyBatis框架零基础快速入门案例详解

    目录 一.创建数据库和表 二.创建maven工程 三.代码编写 1.编写Student实体类 2.编写DAO接口StudentDao 3.编写DAO接口Mapper映射文件StudentDao.xml. 4.创建MyBatis主配置文件 四.创建测试类进行测试 1.创建测试类MyBatisTest 2.配置日志功能 五.增删改操作 insert操作 MyBatis下载地址:https://github.com/mybatis/mybatis-3/releases 一.创建数据库和表 数据库名ss

  • Java的Socket网络编程基础知识入门教程

    一.TCP/IP简介 TCP/IP协议族是互联网使用的协议,也可以用在独立的专用网络中. TCP/IP协议族包括了IP协议.TCP协议和UDP协议. IP协议使用IP地址来分发报文,但它是尽力而为的服务,报文可能丢失.乱序或者 重复发送.TCP和UDP协议在IP协议基础上增加了端口号,从而在两台主机的应用 程序间建立起透明的连接. 不同的是,TCP协议会对IP层的错误进行修复,它通过握手消息在主机间建立连接, 之后通过在消息中加入序列号来恢复消息中的错误.而UDP只是简单地扩展了IP协议, 使它

  • JAVA基础快速从入门到精通

    目录 java程序基本结构 程序注释 变量常量 变量 常量 数据类型与类型转换 常用数据类型 类型转换 运算符表达式 标识符关键字保留字 小常识 这里是JAVA成仙之路 java程序基本结构 java程序的源码文件是Xxx.java,Xxx代码类名和文件名一致(一般要求首字母大写,从第二个单词首字母大写. 新建一个类,类名User class User{ } 新建一个User类,执行代码在控制台打印出"hello 中国"的效果 class User{ public static voi

  • Linux多线程编程快速入门

    本文主要对Linux下的多线程进行一个入门的介绍,虽然是入门,但是十分详细,希望大家通过本文所述,对Linux多线程编程的概念有一定的了解.具体如下. 1 线程基本知识 进程是资源管理的基本单元,而线程是系统调度的基本单元,线程是操作系统能够进行调度运算的最小单位,它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 一个进程在某一个时刻只能做一件事情,有了多个控制线程以后,在程序的设计成在某一个时刻能够做

  • python FTP编程基础入门

    一.FTP工作流程 1.客户端链接远程主机上的FTP服务器 2.客户端输入用户名和密码(或者"anonymous"和电子邮件地址) 3.客户端和服务器进行各种文件传输和信息查询操作 4.客户端从远程FTP服务器退出,结束传 二.FTP文件表示 1.分三段表示FTP服务器上的文件 2.HOST:主机地址,类似于ftp.mozilla.org,以ftp开头 3.DIR:目录,表示文件所在本地的地址,例如:pub/andorid/focus/1.1 4.File:文件名称,例如:Klar-1

  • python SOCKET编程基础入门

    一.UDP编程 1.客户端Client:发起访问的一方. 2.服务器端 3.server段编程 (1)建立socket,socket是负责具体通信的一个实例 (2)绑定,为创建的socket指派固定的端口和IP地址 (3)接受对方发送内容 (4)给对方发送反馈,此步骤为非必须步骤 4.Client端编程 (1)建立通信的socket (2)发送内容到指定服务器 (3)接受服务器给定的反馈内容 5.模拟一下这个过程 (1)我们先建立一个服务器的函数 #服务器案例 import socket ​ #

  • Blender Python编程快速入门教程

    目录 Blender Python 编程 数据访问 访问集合 访问属性 数据创建/删除 自定义属性 上下文 Context 运算符 Operators (Tools) Operator Poll() 将 Python 集成到 Blender 的方式 示例运算符 示例面板 数据类型 原生类型 内部类型 Mathutils 类型 动画 Blender Python 编程 支持的特性: 编辑用户界面可以编辑的任何数据(场景,网格,粒子等). 修改用户首选项.键映射和主题. 使用自己的设置运行工具. 创

  • java RocketMQ快速入门基础知识

    如何使用 1.引入 rocketmq-client <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>4.1.0-incubating</version> </dependency> 2.编写Producer DefaultMQProducer produce

随机推荐