Почему «&» дает мне адрес памяти некоторых объектов, но не других? - PullRequest
0 голосов
/ 01 марта 2020

Это код вопроса (строка комментария «строка вопроса» указывает на то, о чем я говорю): https://tour.golang.org/moretypes/20

Почему код похож на:

var a int
fmt.Println(&a)

Дайте мне адрес памяти ... но код вроде:

var m = map[string]Vertex{
    "Bell Labs": Vertex{
        40.68433, -74.39967,
    }
...
fmt.Println(&m)

Разве это не так?

Разница между типами объектов?

Ответы [ 3 ]

5 голосов
/ 01 марта 2020

Иногда бывает сложно сказать «почему» что-то определенным образом, но это поведение указано в документации fmt пакета . По какой-либо причине формат по умолчанию для указателя на простой объект, такой как целое число, равен %p (ячейка памяти в шестнадцатеричном виде с начальным значением 0x), в то время как формат по умолчанию для указателя на составной объект, такой как Карта & плюс формат по умолчанию для составного объекта.

Но это всего лишь формат по умолчанию (%v), который генерирует fmt.Println. Если вы хотите напечатать адрес карты, вы можете переключиться на fmt.Printf (что позволяет указать строку произвольного формата) и явно использовать %p:

    fmt.Printf("%p\n", &m)
2 голосов
/ 01 марта 2020

Да, это связано со способом написания fmt.Println, в частности, с функцией printValue в print.go при https://github.com/golang/go/blob/go1.14/src/fmt/print.go#L762

. Вы можете использовать fmt.Printf("%p\n",m) для убедитесь, что адрес напечатан.

0 голосов
/ 01 марта 2020

Один простой тип, а другой составной тип.

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