Я получил карту 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
}