Вызов метода с приемником указателя объектом вместо указателя на него?

v – объект Vertex , а Scale – метод для указателя на Vertex . Тогда почему v.Scale(10) не ошибается, учитывая, что v не является указателем на объект Vertex ? Благодарю.

 package main import ( "fmt" "math" ) type Vertex struct { X, Y float64 } func (v Vertex) Abs() float64 { return math.Sqrt(vX*vX + vY*vY) } func (v *Vertex) Scale(f float64) { vX = vX * f vY = vY * f } func main() { v := Vertex{3, 4} v.Scale(10) fmt.Println(v.Abs()) } 

Спец: Звонки:

Вызов метода xm() действителен, если набор методов (тип) x содержит m а список аргументов может быть назначен списку параметров m . Если x адресуется, а набор методов xx содержит m , xm() является сокращением для (&x).m() .

Компилятор видит, что Scale() имеет приемник указателя, а также то, что v адресуется (как локальная переменная), поэтому v.Scale(10) будет интерпретироваться как (&v).Scale(10) .

Это всего лишь один из многих удобств, предлагаемых спецификацией, поэтому исходный код может оставаться чистым.

Это автоматический разыменования Go:

Из https://golang.org/ref/spec#Method_values :

Как и в случае с селекторами, ссылка на метод без интерфейса с приемником значений с использованием указателя автоматически разыгрывает этот указатель: pt.Mv эквивалентно (* pt) .Mv.

  • Объявлять переменные в верхней части функции или в отдельных областях?
  • R: 2 функции с тем же именем в двух разных пакетах
  • Возврат указателя локальной переменной C ++
  • Возвращаемые массивы / указатели от функции
  • Опциональный параметр закрытия с быстрой скоростью 3
  • C ++ наследует от нескольких базовых classов с тем же именем виртуальной функции
  • Проходит ли указатель указателя, передается по значению в C ++?
  • c ++ -
  • Что такое гражданская функция первого classа?
  • c ++ проблема с перегрузкой функции в унаследованном classе
  • Как создать функцию шаблона внутри classа? (C ++)
  • Давайте будем гением компьютера.