gob 的深度拷贝

本文探讨了在项目中使用gob encoder和decoder代替protobuf进行RPC协议时遇到的问题。gob为了提高效率,不会拷贝零值,包括指针指向的零值。这在protobuf结构体的深度拷贝中是个坑,因为protobuf中nil指针的序列化行为可能在不同端有所不同。建议使用proto.Clone()进行protobuf的深拷贝。
摘要由CSDN通过智能技术生成

项目中用了protobuf 做 RPC 协议,然后据说 gob 的encoder 和 decoder 比 protobuf 效率更高,于是写了一个用于 protobuf 结构体的深度拷贝库函数

func DeepCopy(dst, src interface{}) error {
    var buf bytes.Buffer
    if err := gob.NewEncoder(&buf).Encode(src); err != nil {
   
        return err
    }
    return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst)
}

然而实际使用的时候发现有点坑。
gob 为了提高效率,对于 0 值是不拷贝的,不仅仅是整型的零值,还包括指向零值的指针,也不会拷贝。

测试代码如下:

package main

import<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值