Удаление записи карты уничтожает другие записи - PullRequest
0 голосов
/ 30 марта 2019

Я получил карту 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...