删除地图条目会破坏其他条目

时间:2019-03-30 14:21:30

标签: go

我得到了具有结构map[uint64]*target的地图target

type target struct {
    sync.RWMutex
    path       string
    backupPath string
    inode      uint64
    waitingChildred []*target
}

使用delete(mymap, some_uint64)删除条目后,地图上仍保留一个指向nil的条目(我要删除的条目)。我不知道发生了什么,所以调试非常困难。

预执行:

m: <*main.inodeMap>(0xc00015a960)
 -> RWMutex: <sync.RWMutex>
 -> _map <map[uint64]*main.target>
   -> 2363967: <*main.target>(0xc000060420)
        ...
   -> 2365973: <*main.target>(0xc0001024e0)
        ...
inumber: 2363967

执行: delete(m._map, inumber)

执行后:

m: <*main.inodeMap>(0xc00015a960)
 -> RWMutex: <sync.RWMutex>
 -> _map <map[uint64]*main.target>
   -> 2363967: nil <*main.target>

我希望这是一个指针问题,但是映射条目指向不同的地址,所以这不应该是问题。

编辑: 那就是我正在使用的方法:

func (m *inodeMap) deleteTarget(inumber uint64) error {
    t, ok := m.getTargetByInode(inumber)
    if !ok {
        return fmt.Errorf("...")
    }

    if len(t.waitingChildred) > 0 {
        return fmt.Errorf("...")
    }

    m.Lock()
    delete(m._map, inumber)
    m.Unlock()

    return nil
}

那是地图的坚固

type inodeMap struct {
    sync.RWMutex
    _map map[uint64]*target
}

0 个答案:

没有答案