Что означает значение в памяти указателя среза? - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь понять указатели в го, но я все еще немного запутался, как они работают.

Я уже смотрю на другой вопрос по SO: печать адреса слайса в golang, Как напечатать значение указателя объекта Go? Что означает значение указателя? , но я все еще не могу обдумать эту концепцию.

package main

import (
    "fmt"
)

func main() {
    numbers := myNumbers{42}
    println("Pointer to numbers", &numbers)
    numbers.printSlice()
    numbers.printPointer()
}

type myNumbers []int

func (m myNumbers) printSlice() {
    fmt.Printf("printSlice - value of m:  %p \n", m)
    fmt.Printf("printSlice - value of &m: %p\n", &m)
}

func (m *myNumbers) printPointer() {
    fmt.Printf("printPointer - value of m:  %p\n", m)
    fmt.Printf("printPointer - value of &m:  %p\n", &m)
}

И вывод:

Pointer to numbers 0xc42000a060
printSlice - value of m:  0xc420016100 
printSlice - value of &m: 0xc42000a080
printPointer - value of m:  0xc42000a060
printPointer - value of &m:  0xc42000c030

Согласно документации goprintSlice, в первой строке будет напечатан адрес первого элемента массива, во второй строке будет напечатан адрес копии заголовка слайса

В printPointer, в первой строке будет напечатано значениеуказатель, во второй строке будет напечатан адрес указателя

В main prinln печатается тот же адрес, что и в первой строке printPointer, поэтому это означает, что в printPointer I 'у вас есть указатель, который указывает на исходный указатель?

Верны ли вышеуказанные предположения?

1 Ответ

0 голосов
/ 10 ноября 2019

numbers в main - это срез, поэтому вы можете рассматривать его как структуру с тремя значениями: от ptr до базового массива, длины, емкости. Когда вы печатаете &numbers, вы печатаете адрес этой структуры.

printPointer имеет получатель указателя, поэтому в printPointer, m является указателем на структуру, определенную в main. Вот почему, когда вы печатаете m, вы получаете то же значение, которое вы напечатали в main. Когда вы печатаете &m, вы печатаете значение указателя на указатель. &m - это указатель, который указывает на получателя функции, который указывает на m в main.

printSlice получает копию m. Поэтому, когда вы печатаете &m, вы печатаете адрес этой копии.

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