CGO编程基础快速入门

 更新时间:2022年12月22日 15:36:45   作者:山与路  
这篇文章主要为大家介绍了CGO编程基础快速入门示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

带你了解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编程基础的资料请关注脚本之家其它相关文章!

相关文章

  • Go语言类型转换的方式有哪些

    Go语言类型转换的方式有哪些

    本文主要介绍了Go语言类型转换的方式有哪些,类型转换主要有4种,分别为断言类型转换、显式类型转换、隐式类型转换、强制类型转换,感兴趣的可以了解一下
    2023-11-11
  • Go Web开发之Gin多服务配置及优雅关闭平滑重启实现方法

    Go Web开发之Gin多服务配置及优雅关闭平滑重启实现方法

    这篇文章主要为大家介绍了Go Web开发之Gin多服务配置及优雅关闭平滑重启实现方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • golang使用sync.singleflight解决热点缓存穿透问题

    golang使用sync.singleflight解决热点缓存穿透问题

    在go的sync包中,有一个singleflight包,里面有一个 singleflight.go文件,代码加注释,一共200行出头,通过 singleflight可以很容易实现缓存和去重的效果,避免重复计算,接下来我们就给大家详细介绍一下sync.singleflight如何解决热点缓存穿透问题
    2023-07-07
  • Golang基于泛化调用与Nacos实现Dubbo代理

    Golang基于泛化调用与Nacos实现Dubbo代理

    这篇文章主要为大家详细介绍了Golang如何基于泛化调用与Nacos实现Dubbo代理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-04-04
  • Go基础语法的使用

    Go基础语法的使用

    本文主要介绍了Go基础语法的使用,包括标识符、关键字、行分隔符、var关键字、:=运算符、空格、注释、package、import、输入输出、运算符、条件控制、循环等,感兴趣的可以了解一下
    2023-11-11
  • CentOS7使用yum安装Golang的超详细步骤

    CentOS7使用yum安装Golang的超详细步骤

    CentOS默认并没有安装golang运行环境,下面这篇文章主要给大家介绍了关于CentOS7使用yum安装Golang的超详细步骤,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 详解Golang中channel的实现

    详解Golang中channel的实现

    channel俗称管道,用于数据传递或数据共享,其本质是一个先进先出的队列,使用goroutine+channel进行数据通讯简单高效,同时也线程安全,本文就给大家讲讲Golang中channel的实现,需要的朋友可以参考下
    2023-09-09
  • 关于golang中map使用的几点注意事项总结(强烈推荐!)

    关于golang中map使用的几点注意事项总结(强烈推荐!)

    map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用,下面这篇文章主要给大家介绍了关于golang中map使用的几点注意事项,需要的朋友可以参考下
    2023-01-01
  • gin自定义中间件解决requestBody不可重复读问题(最新推荐)

    gin自定义中间件解决requestBody不可重复读问题(最新推荐)

    这篇文章主要介绍了gin自定义中间件解决requestBody不可重复读问题,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • 使用Go语言解决Scan空格结束输入问题

    使用Go语言解决Scan空格结束输入问题

    这篇文章主要为大家介绍了使用Go语言来解决Scan空格结束输入问题,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11

最新评论