Указатель Голанга в массиве - PullRequest
0 голосов
/ 17 октября 2019

Я хочу знать, почему этот код не может изменить значение в массиве

Я пытаюсь изменить элемент в массиве по указателю. Не по индексу.

import "fmt"

func main() {
    array := []Type{}

    array = append(array, Type{2})
    array = append(array, Type{3})
    array = append(array, Type{4})
    array = append(array, Type{5})

    res := []*Type{}

    for _, a := range array {
        a1 := a
        res = append(res, &a1)
    }
    for _,v := range res {
        v1 := v
        v1.number++
    }
    for _, t := range res {
        fmt.Print(t.number)
    }
}
type Type struct {
    number int32
}

Мой ожидаемый результат должен быть 3,4,5,6. Но результат не изменился, поэтому я хочу узнать причину детализации. Я новичок в Go. Пожалуйста, расскажите мне подробно

1 Ответ

0 голосов
/ 17 октября 2019

Если вопрос , почему значения в исходном массиве не были изменены , то ответ таков: , поскольку элемент итерации, введенный в range, является копией исходного элемента ,Чтобы решить вашу проблему, вы можете сделать что-то вроде:

for i := range array {
  res = append(res, &array[i])
}

Проверьте следующие ссылки:

  1. https://golang.org/ref/spec#For_clause
  2. https://github.com/golang/go/wiki/Range#gotchas
  3. https://tour.golang.org/moretypes/16
  4. https://github.com/golang/go/issues/22791#issuecomment-345391395
  5. https://www.ardanlabs.com/blog/2017/06/for-range-semantics.html
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...