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

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(v.X*v.X + v.Y*v.Y)
}

func (v *Vertex) Scale(f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}

func main() {
    v := Vertex{3, 4}
    v.Scale(10)
    fmt.Println(v.Abs())
}

Ответы на вопрос(2)

Отhttps://golang.org/ref/spec#Method_values:

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

 nessuno20 июл. 2016 г., 14:45
Тим, правда. См @icza ответ для соответствующего раздела
 Tim20 июл. 2016 г., 14:42
но это противоположность в моем примере. вv.Scale(10), v не указатель, аScale ожидает указатель получателя.
 icza20 июл. 2016 г., 14:40
На самом деле это не значение метода, а простой вызов метода, поэтомуСпец: Звонки раздел актуален.

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

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

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

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

Ваш ответ на вопрос