Я никогда не работал с 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 меняется внутри функции, но карта комнаты - нет. Как мне обращаться с указателями для удаления элемента среза?

0
Russiancold 5 Окт 2018 в 00:23

1 ответ

Лучший ответ

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

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

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

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

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

0
mkopriva 4 Окт 2018 в 22:26