ZBLOG

golang 实现protobuf间不同包相同结构间的深度拷贝

你好,深度拷贝protobuf结构体需要使用到反射。下面是一个示例代码:

package main

import (
    "fmt"
    "reflect"

    pb "path/to/protobuf/package"
)

func deepCopy(src, dst interface{}) {
    srcVal := reflect.ValueOf(src)
    dstVal := reflect.ValueOf(dst).Elem()

    for i := 0; i < srcVal.NumField(); i++ {
        srcField := srcVal.Field(i)
        dstField := dstVal.FieldByName(srcVal.Type().Field(i).Name)

        if !dstField.IsValid() {
            continue
        }

        if srcField.Kind() == reflect.Ptr {
            if !srcField.IsNil() {
                if dstField.Kind() != reflect.Ptr || dstField.IsNil() {
                    dstField.Set(reflect.New(dstField.Type().Elem()))
                }
                deepCopy(srcField.Elem().Interface(), dstField.Interface())
            }
        } else if srcField.Kind() == reflect.Struct {
            deepCopy(srcField.Interface(), dstField.Addr().Interface())
        } else {
            dstField.Set(srcField)
        }
    }
}

func main() {
    // 假设我们有两个不同包的 protobuf 结构体 A 和 B,且它们具有相同的结构
    a1 := &pb.A{
        Field1: "Hello",
        Field2: &pb.B{
            Field1: 10,
            Field2: true,
        },
    }

    b1 := &pb.B{}
    deepCopy(a1.Field2, b1) // 拷贝 A 的 Field2 到 B

    fmt.Println(b1) // 输出:&{10 true}
}

上述代码中的 deepCopy 函数使用了反射遍历结构体中的每一个字段,如果该字段是指针类型,则递归地进行深拷贝;如果该字段是结构体类型,则直接递归进行深拷贝;否则直接进行浅拷贝。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=3185

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?