指向结构(或缺少结构)的指针

Let's say I have defined this struct:

type Vertex struct {
    X, Y float64
}

now it's perfectly legal Go to use it like this:

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

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

but it's also ok not to use a pointer:

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

The results in both cases is the same, but how are they different, internally? Does the use of pointer makes the program run faster?

PS. I get it that the Abs() function needs a pointer as a receiver. That explains the reason why a pointer has been used later in the main function. But why doesn't the program spit out an error when I don't use a pointer and directly call Abs() on a struct instance?

why doesn't the program spit out an error when I don't use a pointer and directly call Abs() on a struct instance?

Because you can get the pointer to (address of) a struct instance.

As mentioned in "What do the terms pointer receiver and value receiver mean in Golang?"

Go will auto address and auto-dereference pointers (in most cases) so m := MyStruct{}; m.DoOtherStuff() still works since Go automatically does (&m).DoOtherStuff() for you.

As illustrated by "Don't Get Bitten by Pointer vs Non-Pointer Method Receivers in Golang" or "Go 101: Methods on Pointers vs. Values", using a pointer receiver (v *Vertex) is great to avoid copy, since Go passes everything by value.

The spec mentions (Method values):

As with method calls, a reference to a non-interface method with a pointer receiver using an addressable value will automatically take the address of that value: t.Mp is equivalent to (&t).Mp.