#导师想让我跟着做一个go语言的项目,正在学习go语言做个记录#
CGO是Go语言提供的一个功能,允许Go程序与C语言代码进行交互。它是Go语言标准库的一部分,通过import "C"语句启用。
基本概念
1.作用:CGO让Go程序能够:
调用C语言函数
使用C语言的数据类型
在Go中使用C的库
2.实现方式:
通过特殊的注释标记C代码
使用cgo工具处理这些特殊注释
生成Go和C之间的桥梁代码
基本语法
/*
#include <stdio.h>
#include <stdlib.h>
*/
import "C"
func main() {
// 调用C的printf
C.printf(C.CString("Hello from C\n"))
}
主要功能
1. 调用C函数
/*
int add(int a, int b) {
return a + b;
}
*/
import "C"
func main() {
sum := C.add(1, 2)
fmt.Println(sum) // 输出3
}
2. 使用C数据类型
/*
typedef struct {
int x;
int y;
} Point;
*/
import "C"
func main() {
p := C.Point{x: 10, y: 20}
fmt.Println(p.x, p.y) // 输出10 20
}
3. 使用C库
/*
#include <math.h>
*/
import "C"
func main() {
fmt.Println(C.sqrt(2)) // 输出1.4142135623730951
}
数据类型转换
CGO提供了类型转换函数:
C.CString(): Go字符串 → C字符串(char*)
C.GoString(): C字符串 → Go字符串
C.GoBytes(): C内存 → Go字节切片
/*
#include <string.h>
*/
import "C"
func main() {
cStr := C.CString("Hello")
defer C.free(unsafe.Pointer(cStr)) // 必须手动释放
length := C.strlen(cStr)
goStr := C.GoString(cStr)
}
内存管理
C分配的内存必须手动释放
使用C.free和unsafe.Pointer
/*
#include <stdlib.h>
*/
import "C"
func main() {
ptr := C.malloc(100)
defer C.free(unsafe.Pointer(ptr))
// 使用ptr...
}
编译要求
使用CGO需要:
1.系统安装有C编译器(gcc/clang)
2.设置CGO_ENABLED=1环境变量
3.可能需要指定CC环境变量
限制与注意事项
1.性能开销:Go和C之间的调用有一定开销
2.内存管理:需要小心处理内存分配和释放
3.类型系统差异:Go和C的类型系统不完全兼容
4.跨平台问题:某些C特性在不同平台表现不同
实际应用场景
1.使用现有的C/C++库
2.性能关键代码用C实现
3.操作系统底层交互
4.与硬件设备交互
CGO是Go语言与现有C生态系统的桥梁,虽然使用它需要额外注意内存管理和类型转换,但它极大地扩展了Go语言的能力范围。
998

被折叠的 条评论
为什么被折叠?



