CGO编程

简介: 1)什么是CGO编程?2)CGO语法3)相关资料一、什么是CGO编程?简单说就是GO语言代码中可以编写C代码和调用C代码,在一些偏底层业务中,用C来编写会比较简单,然后GO中来调用二、CGO语法1)简单案例2)GO与C语言类型转换3)G...

1)什么是CGO编程?
2)CGO语法
3)相关资料

一、什么是CGO编程?
简单说就是GO语言代码中可以编写C代码和调用C代码,在一些偏底层业务中,用C来编写会比较简单,然后GO中来调用

二、CGO语法
1)简单案例
2)GO与C语言类型转换
3)GO语言传值到C语言

(1)简单案例

package main
/*
#include <stdio.h>
int a = 1;
char s[30] = "12345";
int fun1() {
    printf("hello cgo!\n");
}
 */
import "C"
import "fmt"

func main() {
    fmt.Println(C.a)
    fmt.Println(C.s)
    C.fun1()
}

输出结果:
1
[49 50 51 52 53 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
hello cgo!

C代码在GO语言中嵌入在/**/内,然后引入C代码,必须在紧接的下一行,不能有空行或其他代码,否则不能引入

/*
C代码
*/
import "C"

然后GO中调用C代码的话,以C. + 变量名或函数名

(2)GO与C语言类型转换

GO调用打印C变量类型:

package main
/*
#include <stdio.h>
int a = 1;
float f = 1.2;
double d = 1.3;
char c = '1';
char s[30] = "12345";
 */
import "C"
import "fmt"

func main() {
    fmt.Printf("int      %T\n", C.a)
    fmt.Printf("char     %T\n", C.c)
    fmt.Printf("char[30] %T\n", C.s)
    fmt.Printf("float    %T\n", C.f)
    fmt.Printf("double   %T\n", C.d)
}

输出:
int      main._Ctype_int
char     main._Ctype_char
char[30] [30]main._Ctype_char
float    main._Ctype_float
double   main._Ctype_double

C -> GO

int,float,double,char类型变量可以直接强转

// 转换 C 字符串到 Golang 字符串
func C.GoString(*C.char) string

// 转换一定长度的 C 字符串到 Golang 字符串
func C.GoStringN(*C.char, C.int) string

// 对于C字符串数组变量,没有办法直接用C.GoString()和C.GoStringN()直接转换,可以使用chart*替代字符串数组变量的使用

GO -> C

对于int,float,double,char可以直接强转赋值
char*使用C.CString()

3)GO语言传值到C语言

package main
/*
#include <stdio.h>
int a = 1;
float f = 1.2;
double d = 1.3;
char c = '1';
char* s = "12345";
int fun1(int a, char c, float f, double d,char *s) {
    printf("%d %c %f %f %s\n", a, c, f, d, s);
}
 */
import "C"

func main() {
    C.fun1(1, 'a', 1.2, 1.5, C.CString("dsadsad"))
}

三、相关资料
1)https://www.kancloud.cn/wizardforcel/gopl-zh/106479
2)https://studygolang.com/articles/8106
3)https://studygolang.com/articles/3190

目录
相关文章
|
机器学习/深度学习 数据采集 搜索推荐
多模型DCA曲线:如何展现和解读乳腺癌风险评估模型的多样性和鲁棒性?
多模型DCA曲线:如何展现和解读乳腺癌风险评估模型的多样性和鲁棒性?
501 1
|
安全 编译器 Go
什么是 CGO?什么时候会用到它?
【8月更文挑战第31天】
1511 0
|
安全 网络安全 PHP
Pluck-CMS-Pluck-4.7.16 远程代码执行(CVE-2022-26965)
Pluck-CMS-Pluck-4.7.16 远程代码执行(CVE-2022-26965)
|
API 数据安全/隐私保护 开发者
淘宝 API:关键词搜商品列表接口,助力商家按价格销量排序分析数据
此接口用于通过关键词搜索淘宝商品列表。首先需在淘宝开放平台注册并创建应用获取API权限,之后利用应用密钥和访问令牌调用接口。请求参数包括关键词、页码、每页数量、排序方式及价格区间等。返回结果含总商品数量及具体商品详情。使用时需注意签名验证及官方文档更新。
|
存储 边缘计算 资源调度
云计算与虚拟化是什么关系
云计算与虚拟化是什么关系
462 2
|
存储 持续交付 数据安全/隐私保护
Docker 注册中心
【8月更文挑战第24天】
318 0
|
数据可视化 SDN Python
复动力系统 | 混沌 | Lozi 映射吸引子的可视化与交互式探索
该文介绍了一篇关于Lozi映射吸引子可视化和交互式探索的文章。Lozi映射是混沌理论中的一个模型,展示非线性动力系统的复杂性。通过Python和matplotlib,作者实现了Lozi映射的可视化,并添加交互功能,允许用户缩放以详细观察混沌吸引子。文中还给出了Lozi映射的数学定义,并提供了Python代码示例,演示如何绘制和动态调整吸引子的显示。
|
人工智能 自然语言处理 测试技术
RoBERTa
“【5月更文挑战第30天】”
325 1
|
数据采集 机器学习/深度学习 算法
数据治理之参考数据与主数据管理
最近凑巧参与了一次某行业的业务共创会议,期间讨论到了主数据系统,还有我们该如何参与主数据系统建设的话题。说实话,我一直以为我不会有机会参与到主数据与参考数据系统的话题中去,所以,又去把DAMA的书籍翻了翻。顺便也重新思考了一下主数据与参考数据这个数据治理的课题。
3173 1
数据治理之参考数据与主数据管理
|
编解码 JavaScript 前端开发
【专栏】介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例
【4月更文挑战第29天】本文介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例。Base64编码将24位二进制数据转换为32位可打印字符,用“=”作填充。文中展示了各语言的编码解码代码,帮助开发者理解并应用于实际项目。
570 1