изменение глобального среза в функции - PullRequest
0 голосов
/ 05 октября 2018

Я никогда не работал с C / C ++, поэтому я немного застрял с указателями на ходу.Проблема в том, что у меня есть map[string][]InteractiveItems для каждой «комнаты», и я хочу изменить ее часть в функции.Вот оно:

func (r *room) getItem(arg string) InteractiveItem {
for i, val := range r.interactiveItems {
    for _, item := range val {
        if item.getName() == arg {
            var idxToDelete int
            for idx := range val {
                if val[idx].getName() == arg {
                    idxToDelete = idx
                    break
                }
                if len(val) == 0 {
                    delete(r.interactiveItems, i)
                }
            }
            val = append(val[:idxToDelete], val[idxToDelete+1:]...)
            return item
        }
    }
}
return nil

Очевидно, val меняется внутри функции, но карта комнаты - нет.Как мне поступить с указателями для удаления элемента среза?

1 Ответ

0 голосов
/ 05 октября 2018

Это потому, что все в Go передается по значению.

Для вашего случая это означает, что при выполнении итерации по карте на каждой итерации переменной val присваивается значение копия соответствующего значения среза.Поэтому повторное нарезание значения val внутри цикла не влияет на исходный срез внутри карты, поскольку один является копией, а не ссылкой на другой.

Чтобы изменить срез, находящийся внутрикарту, которую вы можете переназначить результат операции append на соответствующий ключ карты.

r.interactiveItems[i] = append(val[:idxToDelete], val[idxToDelete+1:]...)

Имейте в виду, что при копировании среза он не копирует данные, на которые указывает срез, он копирует только «дескриптор» среза.

...