...

パッケージ ring

import "container/ring"
概要
目次

概要 ▾

ring パッケージは循リングリスト上の操作を実装します。

type Ring

Ring は,循リングリストまたはリングの要素です。 リングには始まりも終わりもありません。 リング要素へのポインタは,リング全体への参照として機能します。 空のリングは nil Ring ポインタとして表されます。 Ring のゼロ値は, nil 値を持つ 1 要素のリングです。

type Ring struct {
    Value interface{} // クライアントが使用するため。 このライブラリでは触れられていない
    // エクスポートされていないフィールドがあります
}

func New

func New(n int) *Ring

New は n 個の要素からなるリングを作成します。

func (*Ring) Do

func (r *Ring) Do(f func(interface{}))

Do は,リングの各要素に対して,順に関数 f を呼び出します。 f が *r を変更した場合の Do の動作は未定義です。

コード:

// サイズ 5 の新しいリングを作る
r := ring.New(5)

// リングの長さを取得する
n := r.Len()

// いくつかの整数値でリングを初期化する
for i := 0; i < n; i++ {
    r.Value = i
    r = r.Next()
}

// リングを反復処理してその内容を表示する
r.Do(func(p interface{}) {
    fmt.Println(p.(int))
})

出力:

0
1
2
3
4

func (*Ring) Len

func (r *Ring) Len() int

Len (長さ) はリング r の要素数を計算します。 実行時間は要素数に比例します。

コード:

// サイズ 4 の新しいリングを作る
r := ring.New(4)

// 長さを表示する
fmt.Println(r.Len())

出力:

4
func (r *Ring) Link(s *Ring) *Ring

Link (リンク) は, r.Next() が s になるようにリング r をリング s に接続し, r.Next() の元の値を返します。 r は空であってはなりません。

r と s が同じリングを指している場合,それらをリンクすると,r と s の間の要素がリングから削除されます。 削除された要素は部分リングを形成し,返り値はその部分リングへの参照です (要素が削除されなかった場合でも,返り値は r.Next() の元の値であり, nil ではありません)。

r と s が異なるリングを指している場合,それらをリンクすると, r の後に s の要素が挿入された 1 つのリングが作成されます。 返り値は,挿入後の s の最後の要素に続く要素を指します。

func (*Ring) Move

func (r *Ring) Move(n int) *Ring

Move は,リング内で n % r.Len() 個の要素分,後方 (n < 0) または前方 (n >= 0) に移動し,そのリング要素を返します。 r は空であってはなりません。

コード:

// サイズ 5 の新しいリングを作る
r := ring.New(5)

// リングの長さを取得する
n := r.Len()

// いくつかの整数値でリングを初期化する
for i := 0; i < n; i++ {
    r.Value = i
    r = r.Next()
}

// ポインタを 3 ステップ先に進める
r = r.Move(3)

// リングを反復処理してその内容を表示する
r.Do(func(p interface{}) {
    fmt.Println(p.(int))
})

出力:

3
4
0
1
2

func (*Ring) Next

func (r *Ring) Next() *Ring

Next は次の ring 要素を返します。 r は空であってはなりません。

コード:

// サイズ 5 の新しいリングを作る
r := ring.New(5)

// リングの長さを取得する
n := r.Len()

// いくつかの整数値でリングを初期化する
for i := 0; i < n; i++ {
    r.Value = i
    r = r.Next()
}

// リングを反復処理してその内容を表示する
for j := 0; j < n; j++ {
    fmt.Println(r.Value)
    r = r.Next()
}

出力:

0
1
2
3
4

func (*Ring) Prev

func (r *Ring) Prev() *Ring

Prev は前のリング要素を返します。 r は空であってはなりません。

コード:

// サイズ 5 の新しいリングを作る
r := ring.New(5)

// リングの長さを取得する
n := r.Len()

// いくつかの整数値でリングを初期化する
for i := 0; i < n; i++ {
    r.Value = i
    r = r.Next()
}

// リングを逆方向に反復処理して内容を表示する
for j := 0; j < n; j++ {
    r = r.Prev()
    fmt.Println(r.Value)
}

出力:

4
3
2
1
0
func (r *Ring) Unlink(n int) *Ring

Unlink (リンク解除) は, r.Next() から開始して,リング r から n % r.Len() 要素を削除します。 n % r.Len() == 0 の場合, r は変更されません。 結果は削除された部分リングです。 r は空であってはなりません。