ホームページ >バックエンド開発 >Golang >Golang リングの使用法

Golang リングの使用法

PHPz
PHPzオリジナル
2023-05-16 13:54:38604ブラウズ

Go 言語は、高速、安全、信頼性の高いプログラミング言語として広く歓迎されています。その中で、golang のリングは循環リンク リストを表すために使用される特別なデータ構造であり、多くのシナリオで使用でき、通常はキャッシュ、キュー、その他のシナリオで使用されます。このデータ構造の具体的な使い方を以下に紹介します。

  1. リングの概念

Go 言語のリングは、Go 標準ライブラリに付属する効率的な循環リンク リスト データ構造であり、コンテナ/リング内に存在します。簡単に言えば、循環リンク リスト構造であり、データ要素に設定されて循環バッファを形成します。要素は先頭に挿入され、末尾に削除されます。時間計算量は O(1) です。効率的な読み取りと書き込みのための循環データ キャッシュまたはタスク キューの実装。

  1. リングの宣言と初期化

Go 言語では、リングの使用は非常に簡単で、まずリング型の変数を宣言する必要があります。 :

var r *ring.Ring

次に、make 関数を使用して空のリングを初期化できます。初期化後、それに要素を追加できます:

r : =ring.New(5) //初期化 5 つの要素を持つリング構造体

ここでの 5 はリングの長さ、つまりリング内の要素の数を表します。

  1. リングのトラバーサル

リングはリング データ構造であるため、その要素間には循環関係があります。リングを横断する場合、最良の方法は、そのメソッド Next() および Prev() を使用することです。

1) Next()

Next() メソッドを使用すると、要素の順序でリングをたどることができます。

r :=ring.New(5)
for i := 1; i

r.Value = i 
r = r.Next() 

}

2) Prev()

Prev( ) メソッド、我々 リングは要素の逆の順序で移動できます:

r :=ring.New(5)
for i := 1; i

r.Value = i 
r = r.Prev() 

}

  1. リング内の操作の追加と削除

1) 操作の追加

リングに要素を追加する場合リンクと割り当ての 2 つの方法が使用されます。

1.1) リンク

リングへの要素の追加は非常に簡単な操作です。リンクを使用して要素をリングに挿入できます:

r := Ring .New(5)
r.Value = 1
r.Next().Value = 2
r.Next().Next().Value = 3
r.Next() 。 Next().Next().Value = 4
r.Next().Next().Next().Next().Value = 5

1.2) 割り当て

もちろん、代入を使用して要素をリングに挿入することもできます。

r :=ring.New(5)

r.Value = 1
r = r.Next()
r.Value = 2
r = r.Next()
r.Value = 3
r = r.Next()
r.Value = 4
r = r.次へ()
r.Value = 5

これら 2 つの方法には、それぞれ長所と短所があります。リンク方法の方が直感的ですが、代入方法の方が便利です。ループを使用して要素を追加できます。バッチ。

2) 削除操作

追加操作に対応して、リング内の操作を削除するには 2 つの方法があります。まず、Remove() メソッドを使用して要素を削除します。

r :=ring.New(5)

r.Value = 1
r = r.Next()
r . Value = 2
r = r.Next()
r = r.Prev()
r.Unlink(1) //ring[1]

の元の要素を削除Unlink () メソッドを使用すると、Remove() メソッドの呼び出しによって発生するメモリ リークを回避できます。

2 番目に、Pluck() メソッドを使用して要素を削除することもできます。

r :=ring.New(5)

r.Value = 1
r = r . Next()
r.Value = 2
r.Next().Value = 3
r.Next().Next().Value = 4
r.Next().Next ( ).Next().Value = 5
r = r.Prev()
r.Next().Next().Pluck(1) //r.Next().Next() の位置を削除要素

これら 2 つの方法には独自の特徴があり、具体的な使用方法は実際の状況に合わせて組み合わせる必要があります。

    リングのアプリケーション
リングは効率的なリング データ構造であるため、多くのシナリオに適用できます。以下に実際のアプリケーション シナリオをいくつか示します。

1) リング キャッシュ

リング キャッシュでは、バッファ領域がいっぱいになると、新しいデータが古いデータを上書きします。この場合、リングは固定長のバッファ領域を維持できる非常に適したデータ構造です。ユーザーがリングからデータを取得すると、データは Next() メソッドを通じて順次取得されます。

2) リング キュー

リング キューでは、キューがいっぱいになると、新しい要素が古い要素を上書きするため、キューをスクロールする必要はありません。リング構造はこのキュー構造を容易に実現できます。キューが空の場合、ring.Len() の戻り値は 0 ですが、nil ではありません。

3) 複数人コラボレーション

一部の複数人コラボレーション シナリオでは、固定長の情報をコラボレーションに参加しているメンバーに周期的に配布する必要があります。リングを使うこんなシーン。

    リングのメリットとデメリット
リングを使用すると、次のようなメリットが得られます。

1) 高い作業効率

リング内部 配列を介した構造となっており、配列へのアクセス方法が巡回的であるため、リングの動作効率が非常に高いです。

2) 安全・信頼性

リング内の演算はすべて配列ベースで実装されているため、演算処理の安全性・信頼性が高く、データの発生や異常な問題が発生しにくいです。 。

3) 配列構造

リングは配列をベースに実装されているため、データ転送などの面倒な操作をすることなく、他の配列構造への変換が可能です。

リングの欠点は次のとおりです:

1) スレッドが安全ではありません

リング構造は単に接続されたリンク リストであるため、ロック保護はありません。したがって、同時操作を実行するときは、独自のスレッド セーフを保護する必要があります。

2) メモリ使用量の問題があります。

リングは配列に基づいて実装されるため、リンク リスト情報を保存するために追加のスペースが必要となり、メモリ使用量に一定の影響を与える可能性があります。

  1. 結論

リングは、リング バッファーやタスク キューなど、順次読み取りと書き込みを行うシナリオで広く使用できる、非常に効率的なデータ構造です。リングを使用すると、データ構造の問題を心配することなく、これらのシナリオをより簡単に実装できます。同時に、リングがスレッドセーフであることを確認し、使用中の過剰なメモリ使用を避けるために、リングの欠点に注意する必要があります。

以上がGolang リングの使用法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。