Почему вы должны использовать звездочку для указателей, а не структурные указатели? - PullRequest
2 голосов
/ 01 марта 2020

Я думаю, что мне не хватает технических знаний. Но я не понимаю, почему я должен использовать * для доступа к значению простого указателя, но не для доступа к значениям структуры.

Например, с простым значением:

func main() {
    i := 42
    p := &i
    *p = 21         // <<< I have to use an asterisk to access the value
    // ...
}

И пример со структурой:

type Vertex struct {
    X int
    Y int
}

func main() {
    v := Vertex{1, 2}
    p := &v
    p.X = 1e9       // <<< I do not have to use an asterisk
    // ...
}

(да, образцы взяты из официального тура go lang здесь: https://go-tour-de.appspot.com/moretypes/4)

Только из моих мыслей я ожидал что-то вроде этого

    *p.X = 1e9

или (да, это было бы несколько странно)

    p.*X = 1e9

Итак, почему бы мне не использовать звездочка для доступа к указателю структуры?

Ответы [ 2 ]

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

Официальный тур Golang, в котором вы нашли этот пример [ здесь ], явно говорит:

Для доступа к полю X структуры, когда у нас есть структура указатель p мы могли бы написать (*p).X. Однако эта запись громоздка, поэтому язык позволяет нам писать просто p.X без явного разыменования.

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

@ Джонатон прав. Его syntacti c сахар. См. Селекторы и выражение селекторов в https://golang.org/ref/spec#Selectors.

В качестве исключения, если тип x является определенным типом указателя и (*x).f является допустимым выражением селектора, обозначающим поле (но не метод), * ​​1009 * является сокращением для (*x).f.

p.z          // (*p).z

pz совпадает с (* p) .z

...