CGO编程基础快速入门
作者:山与路 发布时间:2024-02-05 05:20:58
带你了解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辅助函数时有可能会造成一点的影响。
来源:https://juejin.cn/post/7177571209247195173


猜你喜欢
- 在使用Python的过程中,一定是离不开数据结构的, 也就是List-列表,Tuples-元组,Dictionaries-字典。那实际应用中
- 昨天晚上跑起来一个classification实验,今天发现训练loss在降,然而accuracy永远是0 。。。直觉告诉我evaluati
- 基本命令显示版本信息pip -V安装指定包pip install <packages>pip install -i 'h
- 昨天十行代码实现文字识别,感觉怎样,是不是很爽今天咋们继续利用pillow和pytesseract来实现验证码的识别一、环境配置需要 pil
- 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技
- <img :onerror="errpic" class="customerHead" :sr
- map()是python的一个内建函数, 他能够通过函数来处理序列,比如,我们相关一个数组[0,1,2,3,4,5]所有的数字都+2 , 当
- 前言很多时候开发者需要删除文件。可能是他错误地创建了文件,或者不再需要该文件。无论出于何种原因,都有一些方法可以通过Python来删除文件,
- Python输出整数的方法:先使用str()函数将数字转换成字符串赋值给变量i,再用“if i.count('.') ==
- 需求对于部署在阿里云上的重要系统一般是不让其他人访问的,所以会在负载均衡(SLB)上加上访问控制列表。而使用ASDL拨号上网的宽带来说一般公
- 最近需要将实验数据画图出来,由于使用python进行实验,自然使用到了matplotlib来作图。下面的代码可以作为画图的模板代码,代码中有
- Celery是Python开发分布式任务列队的处理库。可以异步分布式地异步处理任务,也可定时执行任务等等。通常我们可以使用celery在Dj
- 目录一、前言二、使用1.@Component2.compued、data、methods3.@props4.@watch5.@emit三 、
- 1.包: package PaintBrush; /** * * @author lucifer */ public class Paint
- 一、什么是嵌入类型先看如下代码:type user struct { name string &nb
- 自己编写的用于对lineEdit编辑框输入的子网,例如:192.168.60.1/24字符串校验是否合规。# 限制lineEdit编辑框只能
- 怎样编制留言簿程序呢?留言簿程序并不难,有很多选择可以实现,如CGI程序等等。本文介绍怎样用JavaScript编制留言簿程序,下面是一个完
- 1.进入Mysqld如果已经设置Mysql/Bin环境变量,直接在CMD里输入命令,如果没有设置Mysql环境变量,去Mysql安装目录的B
- kNN算法是k-近邻算法的简称,主要用来进行分类实践,主要思路如下:1.存在一个训练数据集,每个数据都有对应的标签,也就是说,我们知道样本集
- 随笔:(1) 命名空间