Почему адрес элемента в срезе одинаков? а как их скопировать в указатель? - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть код:

    //initialize a slice
    arr := make([]int, 0)
    arr = append(arr, 1, 2)
    for _, k := range arr {
        fmt.Printf("%p  %+v\n", &k, k)
    }

    //make a copy, but the element is a pointer
    arrP := make([]*int, 0)
    for _, k := range arr {
        arrP = append(arrP, &k)
    }
    //why arrP is different with arr?
    for _, k := range arrP {
        fmt.Printf("%p  %+v\n", k, *k)
    }

результаты: 0xc000018088 1 0xc000018088 2 0xc000090000 2 0xc000090000 2 мои вопросы :
почему адрес такой же?
почему значение arrP [0] не равно 1?

1 Ответ

2 голосов
/ 24 февраля 2020

См. Go CommonMistakes: Использование ссылки на l oop переменную итератора

почему адрес такой же?

Значение значение k обновляется по мере продвижения вперед l oop.

, почему значение arrP [0] не равно 1?

То же, что и выше.

Для демонстрации с помощью модифицированной версии предоставленного вами примера:

    arr := make([]int, 0)
    arr = append(arr, 1, 2)
    for i, _ := range arr {
        fmt.Printf("%p  %+v\n", &arr[i], arr[i])
    }

    arrP := make([]*int, 0)
    for i, _ := range arr {
        arrP = append(arrP, &arr[i])
    }

    for i, _ := range arrP {
        fmt.Printf("%p  %+v\n", arrP[i], *arrP[i])
    }

Результаты:

0xc00009a010  1
0xc00009a018  2
0xc00009a010  1
0xc00009a018  2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...