简单描述,就是在内存保存数据,在创建和查询过程中,某些字段的值会在查询时意外的被改变,改变的方式也很奇怪。

例如存在一个结构体 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 ,都有这个问题。