Go のチャネルは先入れ先出し (FIFO) キューとして動作するように設計されていますが、状況によっては後入れ先出し (LIFO) スタック動作の場合。この記事では、スタックとして動作するようにチャネルを変更する可能性について検討します。
FIFO の動作の変更
Go チャネルは本質的に FIFO 原則に従って動作します。つまり、最初の要素が挿入されることを意味します。最初に取得されたものです。このデフォルトの動作を変更する組み込みの方法はありません。逆範囲または他の方法を使用して順序を逆にしようとしても、望ましい LIFO 結果は得られません。
代替解決策: ヒープを使用する
チャネルを変更する代わりに、次のことを検討してください。ヒープ データ構造を含む標準 Go ライブラリである「container/heap」パッケージを採用しています。ヒープは、LIFO 順序を維持し、事実上スタックを模倣するツリーベースのデータ構造です。
ヒープ パッケージを使用するには、新しいヒープ タイプをインスタンス化します。
<code class="go">import "container/heap" type myHeap []int func (h myHeap) Len() int { return len(h) } func (h myHeap) Less(i, j int) bool { return h[i] > h[j] } // Reverse order for LIFO func (h *myHeap) Swap(i, j int) { (*h)[i], (*h)[j] = (*h)[j], (*h)[i] } func (h *myHeap) Push(x interface{}) { *h = append(*h, x) } func (h *myHeap) Pop() interface{} { old := *h; n := len(old); x := old[n-1]; *h = old[0 : n-1]; return x }</code>
ここでは、次のようにします。ヒープ タイプを拡張し、LIFO 順序を定義する「Less」、スタックの基本操作である「Push」と「Pop」などのメソッドのカスタム実装を提供しました。
ヒープ データに依存することによってこの構造を使用すると、Go のネイティブ チャネル機能を変更することなく、LIFO 動作を実現し、DFS スタイルの操作を実行できます。
以上がGo チャネルを使用してスタック動作を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。