Golang: Kann der Zeiger in einer Strukturzeigermethode einer anderen Instanz zugewiesen werden?
Ich habe mich mit Golang befasst und ein paar Datenstrukturen implementiert, um zu lernen, wie die Sprache funktioniert. Ich bin beim Schreiben des Codes für einen AVL-Baum auf folgendes Problem gestoßen:
Das Zuweisen des Primärzeigers von einer Strukturzeigermethode scheint keine Auswirkung außerhalb des Funktionsbereichs zu haben. Z.B.tree.rotateLeftToRoot()
führt nicht zutree.left
wird der neue Baum.
Frage Gibt es eine Möglichkeit, den Zeiger in einer Strukturzeigermethode in Golang neu zuzuweisen, oder wird davon generell abgeraten? Im Beispiel wäre dies das"tree = prevLeft"
Linie
Code-Auszug
//Graphical representation of t.rotateLeftToRoot():
// t L
// L R -> LL t
//LL LR LR R
func (tree *AvlTree) rotateLeftToRoot() {
if tree == nil {
return
}
prevLeft := tree.left
if prevLeft != nil {
tree.left = prevLeft.right //tree.left passed root its right branch
prevLeft.right = tree //tree becomes tree.left's right branch
tree.updateHeight()
prevLeft.updateHeight()
tree = prevLeft //desired behaviour: tree.left becomes the new tree
//actual behaviour: no effect when function returns
}
}
Ich habe andere Kombinationen zum Festlegen des Werts oder der Adresse des Baums ausprobiert und keine davon hatte die beabsichtigte Wirkung. Zum Beispiel,*tree = *prevLeft
führt zu einer Endlosschleife.
Zusätzlicher Hinweis: Zurücksenden vontree
und Einstellung"tree = tree.rotateLeftToRoot()"
vermeidet das Problem. Dies funktioniert, aber es scheint schmutzig zu sein, Effekte zu mischen und Rückgabewerte zuzuweisen, wenn der Aufrufer wirklich nur eine Funktion aufrufen möchte, um den Baum zu aktualisieren.
Kann dertree
auf @ gesetzt werdprevLeft
aus der Funktion heraus?