go结构体转换

//使用反射,转换结构体
func SourceToTarget(sourceStruct interface{}, targetStruct interface{}) {
	source := structToMap(sourceStruct)
	targetV := reflect.ValueOf(targetStruct).Elem()
	targetT := reflect.TypeOf(targetStruct).Elem()
	for i := 0; i < targetV.NumField(); i++ {
		fieldName := targetT.Field(i).Name
		sourceVal := source[fieldName]
		if !sourceVal.IsValid() {
			continue
		}
		targetVal := targetV.Field(i)
		targetVal.Set(sourceVal)
	}
}

func structToMap(structName interface{}) map[string]reflect.Value {
	t := reflect.TypeOf(structName).Elem()
	v := reflect.ValueOf(structName).Elem()
	fieldNum := t.NumField()
	resMap := make(map[string]reflect.Value, fieldNum)
	for i := 0; i < fieldNum; i++ {
		resMap[t.Field(i).Name] = v.Field(i)
	}
	return resMap
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C 语言中,结构体是一种自定义的数据类型,它由多个不同类型的成员变量组成。而在 Go 语言中,结构体也是一种自定义数据类型,由多个不同类型的字段组成。 要将 C 语言结构体转换为 Go 结构体,需要按照以下步骤进行: 1. 在 Go 中定义一个结构体类型,与 C 语言中的结构体类型对应。 例如,如果 C 语言中有如下结构体类型: ``` struct Person { char* name; int age; float height; }; ``` 则可以在 Go 语言中定义如下结构体类型: ``` type Person struct { name *C.char age C.int height C.float } ``` 注意,这里使用了 `C` 包来声明 C 语言类型。 2. 在 Go 中使用 `unsafe.Pointer` 类型进行指针转换。 由于 C 语言中的结构体通常会包含指针类型的成员变量,而 Go 语言中的指针类型和 C 语言中的指针类型不完全相同,因此需要使用 `unsafe.Pointer` 类型进行指针转换。 例如,在上面的例子中,`name` 是一个指向字符数组的指针,可以使用 `unsafe.Pointer` 将其转换为 `*C.char` 类型的指针: ``` p := (*C.char)(unsafe.Pointer(person.name)) ``` 3. 使用 `C` 包中的函数进行类型转换和内存分配。 由于 C 语言和 Go 语言使用不同的内存管理机制,因此在进行类型转换和内存分配时需要使用 `C` 包中的函数来处理。 例如,在上面的例子中,如果要将 Go 中的 `Person` 结构体转换为 C 语言中的 `struct Person` 类型,并分配内存空间,可以使用以下代码: ``` cPerson := (*C.struct_Person)(C.malloc(C.size_t(unsafe.Sizeof(C.struct_Person{})))) defer C.free(unsafe.Pointer(cPerson)) cPerson.name = (*C.char)(unsafe.Pointer(person.name)) cPerson.age = person.age cPerson.height = person.height ``` 注意,这里使用了 `C.malloc` 分配内存空间,并使用 `C.free` 释放内存空间。 通过以上步骤,即可将 C 语言结构体转换为 Go 结构体
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值