写代码写多了就是犯糊涂
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结构体的时候里面千万不要有空内存