记录一个坑了我三天Go语法导致gob解析pb的bug

写代码写多了就是犯糊涂

bug源代码和修改好的代码一张清晰的截图对比:

//错误的声明
// PlayerDataList := make([]*message.PlayerData, 1)
// if result.RowsAffected > 0 {
// 	PlayerDataList = append(PlayerDataList, the.GetSPlayerData())
// }

//正确的声明
PlayerDataList := make([]*message.PlayerData, 0)
if result.RowsAffected > 0 {
	PlayerDataList = append(PlayerDataList, the.GetSPlayerData())
}

错误的调试信息

[]*sp_server/message.PlayerData len: 1, cap: 1, [*nil]
[0]:*sp_server/message.PlayerData nil

进行解析后报错:unexpected EOF

func DispatchPacket(packet rpc.Packet) bool {

    xxxx...    

    解析代码:
    buf := bytes.NewBuffer(rpcPacket.RpcBody)
    dec := gob.NewDecoder(buf)
    dec.Decode(&messageName)
    msgName := protoreflect.FullName(messageName)
	packetType, err := protoregistry.GlobalTypes.FindMessageByName(msgName)
	if err != nil || packetType == nil {
		fmt.Printf("FindMessageByName err: %v", err)
		return
	}
	_packet := packetType.New().Interface()
	decErr := dec.Decode(_packet)
	if decErr != nil {
		fmt.Println("解析包出错")
        return
	}


    xxxx...
}

总结

当需要gob内置包去Encode结构体的时候里面千万不要有空内存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值