Голанг: Можно ли перенести указатель в методе struct pointer на другой экземпляр?
Я изучал Голанг и внедрял несколько структур данных, чтобы узнать, как работает язык. Я столкнулся со следующей проблемой при написании кода для дерева AVL:
Назначение первичного указателя из метода struct указателя, кажется, не имеет никакого эффекта вне области функции. Например.tree.rotateLeftToRoot()
не приводит кtree.left
становится новым деревом.
Вопрос: Есть ли способ переназначить указатель в методе struct pointer в Golang, или это вообще не рекомендуется? В примере это будет"tree = prevLeft"
линия.
Фрагмент кода:
//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
}
}
Я пробовал другие комбинации установки значения или адреса дерева, и ни одна из них не имела ожидаемого эффекта. Например,*tree = *prevLeft
приводит к бесконечному циклу.
Дополнительное примечание: возвращениеtree
и настройка"tree = tree.rotateLeftToRoot()"
избегает проблемы. Это работает, но кажется грязным смешивать эффекты и требовать присваивания возвращаемых значений, когда вызывающая сторона действительно хочет иметь возможность вызвать функцию для обновления дерева.
Может лиtree
быть настроенным наprevLeft
изнутри функции?