GOの一般的なデータ構造とアルゴリズムをGO
簡単な例:リンクリストを考えてみましょう。 ジェネリックがなければ、ジェネリックを使用すると、
などがあります。単一のを定義することができます。ここで、リストが保持するデータのタイプを表します。 同じ原則は、並べ替えアルゴリズム(QuickSort、MergESORTなど)などのより複雑なアルゴリズムに適用されます。 重要なのは、LinkedListInt
制約を使用するか、カスタム制約(以下で説明するように)を定義して、一般的な関数とデータ構造に許可されたタイプを指定することです。 GoのGenericsの実装では、単眼化と呼ばれる手法を使用しています。 これは、コンパイル時に、コンパイラが使用される特定のタイプごとに一般的なコードの個別の具体的な実装を生成することを意味します。 これにより、他のいくつかの言語で見つかったより動的な一般的な実装に関連するランタイムオーバーヘッドが回避されます。LinkedListString
LinkedList[T any]
ジェネリックデータ構造またはアルゴリズムのパフォーマンスは、手動で書かれたタイプ固有の実装に非常に似ています。 複数の生成された実装により、バイナリサイズがわずかに増加する場合がありますが、同じ汎用コードで使用される非常に多くの異なるタイプがない限り、これは通常無視できます。 ほとんどの場合、改善されたコードの再利用性と保守性は、マイナーな潜在的なパフォーマンストレードオフを上回ります。 特定のアプリケーションでのパフォーマンス特性を確認するためにベンチマークは常に推奨されます。T
<code class="go">type Node[T any] struct { data T next *Node[T] } type LinkedList[T any] struct { head *Node[T] } func (ll *LinkedList[T]) Append(data T) { newNode := &Node[T]{data: data} if ll.head == nil { ll.head = newNode return } current := ll.head for current.next != nil { current = current.next } current.next = newNode } // ... other LinkedList methods (Prepend, Delete, etc.) ...</code>
>LinkedList[T]
制約とタイプパラメーターを処理する場合、ジェネリックを使用する場合、制約とタイプパラメーターを効果的に処理するにはどうすればよいですか? 一般的な関数とデータ構造で使用できるタイプの制限を指定することができます。 最も単純な制約はany
です。つまり、タイプパラメーターは任意のタイプにすることができます。 ただし、多くのアルゴリズムでは、より具体的な制約が必要ですたとえば、
ソートアルゴリズムでは、型パラメーターを同等にする必要があります。 GOには組み込みの「同等の」制約がないため、インターフェイスを使用して独自の制約を定義する必要があります。インターフェイスを組み合わせたり、カスタムインターフェイスを定義したりすることにより、より複雑な制約を作成できます。 制約を効果的に使用すると、ジェネリックコードの要件を明示的に記載することにより、ランタイムエラーを防ぎ、コードの明確さを改善することができます。 明確に定義された制約により、一般的な関数とデータ構造がより堅牢で理解しやすくなります。既存 可能な限り、より具体的な制約を使用します。
<code class="go">type Node[T any] struct { data T next *Node[T] } type LinkedList[T any] struct { head *Node[T] } func (ll *LinkedList[T]) Append(data T) { newNode := &Node[T]{data: data} if ll.head == nil { ll.head = newNode return } current := ll.head for current.next != nil { current = current.next } current.next = newNode } // ... other LinkedList methods (Prepend, Delete, etc.) ...</code>
エラー処理を無視します。 予期しない動作を防ぐためにこれらのエラーを適切に処理することを忘れないでください。Ordered
T
非効率的なメモリ使用法:
ジェネリック関数内のメモリの割り当てに注意してください。以上がGONICSを活用してGOで一般的なデータ構造とアルゴリズムを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。