Go ツアー演習 #7: バイナリ ツリーの等価性
Go ツアーでバイナリ ツリーの等価性演習を試行すると、次のような問題が発生する可能性があります。ツリーに要素がなくなったときのシグナリングの課題。指定されたコードはチャネルを使用してツリーからの値を通信しようとしますが、このシグナリングの問題に対処できません。
問題
再帰的走査中にチャネルを閉じる値の送信を途中で終了します。 Walk() 関数内で close(ch) を使用すると、すべての値が送信される前にチャネルが閉じられます。
クロージャーを使用した解決策
クロージャーを使用すると、匿名の周囲のスコープから変数を取得する関数。これを使用して、実行完了時にチャネルを自動的に閉じるカスタム ウォーク関数を生成できます。
func Walk(t *tree.Tree, ch chan int) { defer close(ch) // Automatically closes the channel when this function returns var walk func(t *tree.Tree) walk = func(t *tree.Tree) { if t == nil { return } walk(t.Left) ch <- t.Value walk(t.Right) } walk(t) }
このソリューションでは、Walk() 関数はツリーの走査を処理するウォーク クロージャを返します。 。クロージャが終了すると、チャネルが自動的に閉じられ、これ以上送信する値がないことが示されます。これにより、受信側はトラバーサルがいつ完了するかを確実に判断できるようになります。
以上がGo バイナリ ツリーの等価性演習でトラバーサルの終了を適切に通知するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。