Ich lerne gerade mit Go Sprache programmieren. Ich habe einige Schwierigkeiten, Go-Zeiger zu verstehen (und mein C/C++ ist jetzt weit weg ...). In der Tour of Go # 52 (http://tour.golang.org/#52) zum Beispiel las ich:Golang Zeiger
type Vertex struct {
X, Y float64
}
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())
}
Aber wenn statt
schrieb ich:
func (v Vertex) Abs() float64 {
[...]
v := Vertex{3, 4}
Oder auch:
func (v Vertex) Abs() float64 {
[...]
v := &Vertex{3, 4}
und umgekehrt:
func (v *Vertex) Abs() float64 {
[...]
v := Vertex{3, 4}
Ich habe genau das gleiche Ergebnis. Gibt es einen Unterschied (speichertechnisch usw.)?
Hallo und Willkommen bei den Programmierern. Direkte Implementierungsfragen wie diese sind hier nicht Thema, sondern zum Thema Stack Overflow. Ich werde eine Migration einleiten. Hab einen angenehmen Tag. –
Versuchen Sie, das 'v' in allen Methoden zu ändern, und dann' fmt.Println() 'das Original nach dem Anruf, und Sie werden den Unterschied sehen. Mit den '(v Vertex)' - Versionen erhalten Sie eine Kopie des Originals. Wenn es auf einem Zeiger aufgerufen wurde, wird es automatisch für Sie dereferenziert. –
Siehe auch: [Mehrdeutigkeiten von Methodenempfängern] (http://stackoverflow.com/questions/14926860/method-receivers-ambiguity) –