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

目录
相关文章
|
8月前
|
Rust 编译器 Linux
Rust编译过程讲解与环境准备
目前主流编译平台有,GNU、MSVC、LLVM。因为rustc调用了llvm,因此我们以LLVM为例,我们从C语言的编译过程聊,再对比Rust,看它们的编译过程有何差异。
144 0
|
2月前
|
编译器 Go
go语言编译选项
【10月更文挑战第17天】
49 5
|
5月前
|
安全 编译器 Go
什么是 CGO?什么时候会用到它?
【8月更文挑战第31天】
228 0
|
7月前
|
Rust 安全 Linux
RUST 编程语言使构建更安全的软件变得更加容易。RUST ALL THE THINGS 需要什么?
RUST 编程语言使构建更安全的软件变得更加容易。RUST ALL THE THINGS 需要什么?
46 2
|
8月前
|
Rust 算法 C++
【从 C++ 到 Rust:掌握 Rust 基础语法】From C++ to Rust: Mastering Rust Basics
【从 C++ 到 Rust:掌握 Rust 基础语法】From C++ to Rust: Mastering Rust Basics
135 0
|
Rust JavaScript 前端开发
将 Rust 程序编译为 WebAssembly 的知识与实践
本文记叙如何将一个 Rust 语言编译成可执行的 WebAssembly 文件。
241 0
|
8月前
|
Rust JavaScript 前端开发
将 Rust 程序编译为 WebAssembly
将 Rust 程序编译为 WebAssembly
297 0
|
8月前
|
Rust Java Linux
【一起学Rust | 进阶篇 | jni库】JNI实现Java与Rust进行交互
【一起学Rust | 进阶篇 | jni库】JNI实现Java与Rust进行交互
238 0
|
Rust 安全 Linux
如何使用 rust 写内核模块
近年来,Rust 语言以内存安全、高可靠性、零抽象等能力获得大量开发者关注,而这些特性恰好是内核编程中所需要的,所以我们看下如何用rust来写Linux内核模块。
335 5
如何使用 rust 写内核模块
|
JSON Rust C语言
【Rust 基础篇】Rust宏:代码生成的黑魔法
Rust是一门以安全性和性能著称的系统级编程语言,它提供了强大的宏系统,使得开发者可以在编译期间生成代码,实现元编程(Metaprogramming)。宏是Rust中的一种特殊函数,它可以接受代码片段作为输入,并根据需要生成代码片段作为输出。本篇博客将深入探讨Rust中的宏,包括宏的定义、宏的分类、宏的使用方法,以及一些实际场景中的应用案例,以便读者全面了解Rust宏的神奇之处。
176 0