简单描述,就是在内存保存数据,在创建和查询过程中,某些字段的值会在查询时意外的被改变,改变的方式也很奇怪。
例如存在一个结构体 Task 和一个全局变量 list:
var list sync.Map
type Task struct {
ID int64
Name string
User string
}
创建并把 task 保存在全局变量 list 中;
task := Task {
ID: now.UnixMicro(),
Name: "agent-web",
User: "wangds",
}
list.Store(task.Name, task)
执行查询时,task 的值可会意外的改变,发生概率盲猜有 0.1-0.4 ; 而且每次更改代码后,只遵循以下 5 种改变模式中的 1 种:
{
ID: 1677200690411702,
Name: "agent-web",
User: "agent-",
}
{
ID: 1677200690411702,
Name: "1gent-web",
User: "wangds",
}
{
ID: 1677200690411702,
Name: "agent-web",
User: "1angds",
}
{
ID: 1677200690411702,
Name: "agent-web",
User: "167720",
}
{
ID: 1677200690411702,
Name: "167720069",
User: "wangds",
}
全局变量试过其他类型,比如 map 、slice ,还试过一个第三方的内存缓存工具 ristretto ,都有这个问题。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.