Go 语言系列43:CGO 编程入门(四)
这一期我们讲一讲 CGO 中关于 C 数值类型的转换。
数值类型
我们在前几期讲过,在 Go 语言中使用 C 语言是通过访问 C 伪包实现的。下面的表格展示了 Go 语言中数值类型和 C 语言数值类型之间的对应关系:
C语言类型 | CGO类型(调用方法) | Go语言类型 |
char | C.char | byte |
singed char | C.schar | int8 |
unsigned char | C.uchar | uint8 |
short | C.short | int16 |
unsigned short | C.ushort | uint16 |
int | C.int | int32 |
unsigned int | C.uint | uint32 |
long | C.long | int32 |
unsigned long | C.ulong | uint32 |
long long int | C.longlong | int64 |
unsigned long long int | C.ulonglong | uint64 |
float | C.float | float32 |
double | C.double | float64 |
size_t | C.size_t | uint |
这里需要注意数值类型所对应分配的内存大小,例如,在 CGO 中 C 语言的 int
类型是固定为 4
字节大小的,而在 Go 语言中 int
类型分配的内存大小是要看系统的,在 32 位系统下分配的是 4
个字节,而在 64 位系统下分配的是 8
个字节。
当然,你也可以在 C 语言中使用 Go 语言的类型,例如在 C 语言中访问 Go 语言的 int
类型,这里推荐使用
C语言类型 | CGO类型(调用方法) | Go语言类型 |
int8_t | C.int8_t | int8 |
uint8_t | C.uint8_t | uint8 |
int16_t | C.int16_t | int16 |
uint16_t | C.uint16_t | uint16 |
int32_t | C.int32_t | int32 |
uint32_t | C.uint32_t | uint32 |
int64_t | C.int64_t | int64 |
uint64_t | C.uint64_t | uint64 |
当然,这里使用 C 语言类型与 Go 语言类型之间的转换要考虑安全问题,确实坑很多x
参考文献:
[1] 柴树杉;曹春晖, Go 语言高级编程, 北京: 人民邮电出版社, 2019.