cgo中各种类型转换

一、字符串转换

Go字符串转C字符串:使用C.CString函数将Go字符串转换为C字符串,返回值是一个*C.char类型的指针。转换后的C字符串需要手动释放内存

goStr := "Hello, Cgo!"
cStr := C.CString(goStr)
defer C.free(unsafe.Pointer(cStr))

C字符串转Go字符串:使用C.GoString函数将C字符串转换为Go字符串

goStr := C.GoString(cStr)

二、结构体转换

C结构体转Go结构体:创建一个Go结构体,然后使用(*MyStruct)(unsafe.Pointer©)将C结构体转换为go结构体

var cStruct C.stuct_name
goStruct := (*MyStruct)(unsafe.Pointer(&cStruct))

Go结构体转c结构体:定义一个c结构体的Go版本,然后使用C.stuct_name来创建一个C结构体,注意Go结构体的字段与c结构体的字段顺序和类型匹配。

type MyStruct struct {
	Field1 C.int
	Field2 C.double
}

var goStuct MyStuct 
cStruct := C.struct_name(goStruct)

三、数组和切片转换

Go切片转C数组:使用unsafe.Pointer和类型转换

goSlice := []int{1, 2, 3, 4, 5}
C.processArray((*C.int)(unsafe.Pointer(&goSlice[0])), C.int(len(goSlice)))

C数组转Go切片:使用C.GoBytes函数

cArray := C.malloc(C.size_t(5 * int(unsafe.Sizeof(C.int(0)))))
defer C.free(cArray)
// 假设cArray已经填充了数据
goSlice := C.GoBytes(cArray, C.int(5*int(unsafe.Sizeof(C.int(0)))))

以下是一个完整的示例,展示了如何在Go中调用C函数,并进行类型转换

package main

/*
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char* name;
    int age;
} Person;

void printPerson(Person* p) {
    printf("Name: %s, Age: %d\n", p->name, p->age);
}
*/
import "C"
import (
	"fmt"
	"unsafe"
)

func main() {
	// 创建C结构体
	p := C.Person{
		name: C.CString("John Doe"),
		age:  C.int(30),
	}
	defer C.free(unsafe.Pointer(p.name))

	// 调用C函数
	C.printPerson(&p)

	// 处理C字符串
	goStr := C.GoString(p.name)
	fmt.Println("Name in Go:", goStr)
}

三、Go与c整数的转换

Go到c整数 :可以直接赋值,Go会自动转换为适当的整数类型(C.int, C.long等)

var goInt int = 42
cInt := C.int(goInt)

**C到Go整数“” 可以直接赋值,Go会自动转换为适当的Go整数类型。

var cInt C.int = 42
goInt := int(cInt)

四、 Go与c浮点数的转换

Go浮点数到C浮点数, 可以直接赋值, Go会自动转换为适当的C浮点数类型(如C.float, C.double等)

var goFloat float64 = 3.14
cFloat := C.float(goFloat)

C浮点数到Go浮点数, 可以直接赋值, Go会自动转换为适当的Go浮点数类型

var cFloat C.float = 3.14
goFloat := float(cFloat)

五、 Go与c指针的转换

Go指针到c指针: 使用usafe.Pointer()将Go指针转转换为unsafe.Pointer 类型, 然后可以将其转换为适当的c指针类型

var goInt *int = new(int)
cInt := (*C.int)(unsafe.Pointer(goInt))

c指针到Go指针:使用(*T)(unsafe.Pointr©)将c指针转换为Go指针,其中T是go中的类型,c是c指针

var cInt *C.int = C.malloc(C.size_t(8))
goInt := (*int)(unsafe.Pointer(cInt)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绛洞花主敏明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值