你好,深度拷贝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 函数使用了反射遍历结构体中的每一个字段,如果该字段是指针类型,则递归地进行深拷贝;如果该字段是结构体类型,则直接递归进行深拷贝;否则直接进行浅拷贝。




