我得到了具有结构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
}