構造体ポインター メソッドのポインターは別のインスタンスに再割り当てできますか?
Go 構造体メソッドでポインターを操作する場合、プライマリ メソッドを再割り当てする別のインスタンスへのポインタは難しい場合があります。これは、通常の Go 構造体へのポインタの再割り当てとは異なります。
背景: ポインタ値
Go では、ポインタは別の変数のメモリ アドレスを格納する値です。ポインター値を変更する場合、実際にはポインター自体ではなく、ポイントされた変数を変更することになります。
ポインター メソッドとレシーバーの基本型
Go では、構造体ポインター メソッドは次のようにする必要があります。レシーバーの基本型は T です。ここで、T は構造体の型です。これは、受信者が T へのポインターへのポインターになることができないことを意味します。
ポインターの再割り当てオプション
1。ポインタをポインタ関数に渡す:
これには、構造体へのポインタへのポインタを受け取る非メソッド関数の記述が含まれます。関数内で、ポイントされたポインターを変更できます。
func rotateLeftToRoot(ptree **AvlTree) { // Pointer to the pointer to the AvlTree tree := *ptree // Update pointer to the new root *ptree = tree }
2.更新されたポインタを返す:
これには、メソッドから更新されたポインタを返し、それを呼び出しコード内の目的の変数に割り当てることが含まれます。
func (tree *AvlTree) rotateLeftToRoot() *AvlTree { // Update pointer to the new root prevLeft := tree.left if prevLeft != nil { tree.left = prevLeft.right prevLeft.right = tree tree = prevLeft } return tree } // Usage: tree = tree.rotateLeftToRoot()
ツリー一般:
Go では、特にデータ構造操作において、メソッドからツリーを返すことは珍しいことではありません。 Go 標準ライブラリの append() 関数が更新されたスライスを返すのと同じように、目的のツリーを更新するには、変更されたツリー ポインタを返すことが必要な場合があります。
以上がGo 構造体ポインター メソッドはレシーバー ポインターを別のインスタンスに再割り当てできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。