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

标签:CGO,编程,基础
0
投稿

猜你喜欢

  • 网页设计应急小技巧

    2011-10-05 18:52:57
  • Python使用filetype精确判断文件类型

    2023-07-09 12:30:12
  • Python使用pickle模块存储数据报错解决示例代码

    2023-12-10 02:05:05
  • Python collections.deque双边队列原理详解

    2022-02-21 04:25:00
  • MySQL查询字段实现字符串分割split功能的示例代码

    2024-01-22 03:18:55
  • 如何将python代码生成API接口

    2022-10-27 14:37:39
  • Python图片视频超分模型RealBasicVSR的使用教程

    2021-10-11 13:40:04
  • 详解oracle mysql 中的“不等于“ <> != ^= is not

    2024-01-25 03:35:08
  • python机器基础逻辑回归与非监督学习

    2023-03-17 03:59:05
  • 关于Flask项目无法使用公网IP访问的解决方式

    2021-01-03 10:04:00
  • mysql 数据库备份的多种实现方式总结

    2024-01-18 23:03:25
  • Go语言调用Shell与可执行文件的实现

    2024-02-06 17:03:44
  • MySQL七大JOIN的具体使用

    2024-01-28 04:11:31
  • Django中redis的使用方法(包括安装、配置、启动)

    2022-03-09 02:15:59
  • Python中的异常处理讲解

    2023-01-29 11:22:57
  • mysql数据库中字符集乱码问题原因及解决

    2024-01-14 19:38:10
  • Golang 操作TSV文件的实战示例

    2023-07-18 06:46:01
  • 详解如何在Go项目中输出版本信息

    2024-04-26 17:17:20
  • 深入PHP magic quotes的详解

    2024-05-11 10:12:00
  • 基于node打包可执行文件工具_Pkg使用心得分享

    2024-05-08 09:37:47
  • asp之家 网络编程 m.aspxhome.com