记一次golang struct字符串值被挤掉(被异常修改)的问题
创始人
2024-03-26 04:26:28
0

使用的是gofiber框架,在包内设置了一个全局变量来保存数据,如下:

var list = make(map[int64]*Task, 10)
type Task struct {ID int64Name string
}

gofiber设置了两个接口,一个是创建:

func Create(c *fiber.Ctx) error {task := &Task{ID: time.Now().Unix(),Name: "agent-web",}list[task.ID] = taskreturn c.JSON(task)
}

一个是查询:

func Detail(c *fiber.Ctx) error {_id, err := strconv.Atoi(c.Query("id"))if err != nil {return c.SendString("id为空")}id := int64(_id)task, ok := list[id]if !ok {return c.SendString("task不存在")}return c.JSON(task)
}

我在node端依次请求创建与查询,就会有几率触发Name异常,比如创建了:

{ID: 1670430590397846,Name: "agent-web"
}

请求Detail时,却变成了:

{ID: 1670430590397846,Name: "167043059"
}

Name异常的表现是9个字符被ID的前9个数字替代。
在Create方法里,创建完立即查询,值是正常的,测了很多次;
我建了个协程,在里面每隔1秒打印一次全局变量list,仅是创建的话,不会异常,如果请求Detail,就会有几率瞬间改变Name。

后来我把创建方法的ID值改成计数器,,测了10000次也不会出现这种异常的情况了:

var counter int64 = 0
func Create(c *fiber.Ctx) error {counter ++task := &Task{ID: counter,Name: "agent-web",}list[task.ID] = taskreturn c.JSON(task)
}

建议以后少用int,多用string

希望有识之士帮忙分析一下其中原因。


我错了,我判断是否出现异常的方法是判断查询到的name是否是数字,这是错的。
因为出现了这种情况:
在这里插入图片描述
name的第一个字符被id的第一个字符替换了!
暂时无解了,id换字符串试试。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...