Sono di 2 giorni nel mondo di Golang e sto passando per il go tour. Non ho potuto fare a meno di notare una particolarità che non riesco a trovare in termini corretti.Perché non posso assegnare il valore del tipo a un'interfaccia che implementa metodi con il puntatore del tipo di ricevitore per quel tipo?
Questo codice viene eseguito alla perfezione:
package main
import (
"fmt"
"math"
)
type Vertex struct{
X,Y float64
}
type Abser interface{
Abs() float64
}
func (v Vertex) Abs() float64{ //method with value receiver argument
return math.Sqrt(v.X*v.X+v.Y*v.Y)
}
func main(){
var myVer Vertex = Vertex{3,4}
var inter Abser
inter = &myVer //assigning *Vertex type to inter
fmt.Println(inter.Abs())
}
Nel frattempo, il codice seguente mostra un errore:
package main
import (
"fmt"
"math"
)
type Vertex struct{
X,Y float64
}
type Abser interface{
Abs() float64
}
func (v *Vertex) Abs() float64{ //method with pointer receiver argument
return math.Sqrt(v.X*v.X+v.Y*v.Y)
}
func main(){
var myVer Vertex = Vertex{3,4}
var inter Abser
inter = myVer //assigning Vertex type to inter
fmt.Println(inter.Abs())
}
L'errore è:
interface.go:18: cannot use myVer (type Vertex) as type Abser in assignment: Vertex does not implement Abser (Abs method has pointer receiver)
fino ad arrivare a questa sezione del tour, ho potuto capire che i creatori di Go hanno abbandonato le notazioni ingombranti come
(*v).method1name()
(&v).method2name()
In modo che i metodi con i destinatari del valore possano essere utilizzati con valori e puntatori e viceversa.
Perché la lingua discrimina tra i due (valore e puntatore) quando si lavora con le interfacce? Non sarebbe più conveniente se qui si applicassero gli stessi principi di riferimento/dereferenziazione?
Spero di non mancare qualcosa di troppo apparente. Grazie!
Sono venuto qui per discutere lo stesso esempio. Non riesco a capirlo. È qui: https://tour.golang.org/methods/9 –