Изменение значений полей для указателей на структуры в Go

Новичок в Golang и пытаюсь понять фрагмент кода, с которым столкнулся. В блоге, который я читал, они определяют структуру Vertex следующим образом:

type Vertex struct {
  X int
  Y int
}

А затем покажите пример того, как создать новый экземпляр и изменить одно из его полей:

v1 := Vertex{1,2}
v1.X = 3

Однако они показывают пример того, как создать указатель на экземпляр этой структуры и изменить одно из ее полей:

v2 := &Vertex{3,4}
v2.X = 3

Это меня немного смутило. Для меня оператор v2 := &Vertex{3,4} переводится как: «v2 — это указатель на новый экземпляр Vertex{3,4}». Если это так, то если v2 является указателем на структуру Vertex, а не самой структурой Vertex, то как мы можем вызвать для нее v2.X (это указатель!!!)?


person hotmeatballsoup    schedule 20.04.2020    source источник
comment
Компилятор (или это среда выполнения? Я забыл) автоматически разыменовывает указатель. Итак, v2.X становится (*v2).X.   -  person mkopriva    schedule 20.04.2020
comment
... для получения дополнительной информации см.: golang.org/ref/spec#Selectors ... В качестве исключения, если тип x является определенным типом указателя и (*x).f является допустимым выражением селектора, обозначающим поле (но не метод), x.f является сокращением для (*х).ф.   -  person mkopriva    schedule 20.04.2020
comment
C используйте для этого ->, но в Go достаточно простого ., поэтому в дополнительном символе нет необходимости.   -  person Volker    schedule 20.04.2020
comment
Я думаю, что этот вопрос имеет значение для новичков в Go. Для человека добраться до селекторов при поиске ответа на эту проблему непросто, поскольку в основном он будет искать такие понятия, как продвижение типов или автоматическое разыменование и т. д. Учитывая, как документирован язык Go (в значительной степени правила грамматики, используемые компилятор, то есть еще одна вещь, которую нужно научиться читать и понимать, помимо языка), это не исключено, что это может быть чем-то, что может сбить с толку изучающего новый язык.   -  person    schedule 09.04.2021


Ответы (1)


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

Вот почему v2.X совпадает с (*v2).X

Подробнее см. здесь

person Eklavya    schedule 20.04.2020