Spec-Zone.ru › Go

Пакет ring

  • import "container/ring"
  • Обзор
  • Указатель
  • Примеры

Обзор

Пакет ring реализует операции над кольцевыми списками.

Указатель

  • тип Ring
  • функция New(n int) *Ring
  • функция (r *Ring) Do(f func(any))
  • функция (r *Ring) Len() int
  • функция (r *Ring) Link(s *Ring) *Ring
  • функция (r *Ring) Move(n int) *Ring
  • функция (r *Ring) Next() *Ring
  • функция (r *Ring) Prev() *Ring
  • функция (r *Ring) Unlink(n int) *Ring

Примеры

Ring.Do
Ring.Len
Ring.Link
Ring.Move
Ring.Next
Ring.Prev
Ring.Unlink

Файлы пакета

ring.go

тип Ring

Ring — это элемент кольцевого списка, или кольца. У колец нет начала и конца; указатель на любой элемент кольца служит ссылкой на всё кольцо. Пустые кольца представлены указателями Ring со значением nil. Нулевое значение Ring — это кольцо из одного элемента со значением nil.

type Ring struct {
    Value any // for use by client; untouched by this library
    // contains filtered or unexported fields
}

функция New

func New(n int) *Ring

New создаёт кольцо из n элементов.

функция (*Ring) Do

func (r *Ring) Do(f func(any))

Do вызывает функцию f для каждого элемента кольца в прямом порядке. Поведение Do не определено, если f изменяет *r.

Пример

Код:

// Create a new ring of size 5
r := ring.New(5)

// Get the length of the ring
n := r.Len()

// Initialize the ring with some integer values
for i := 0; i < n; i++ {
    r.Value = i
    r = r.Next()
}

// Iterate through the ring and print its contents
r.Do(func(p any) {
    fmt.Println(p.(int))
})

Вывод:

0
1
2
3
4

функция (*Ring) Len

func (r *Ring) Len() int

Len вычисляет количество элементов в кольце r. Время выполнения пропорционально количеству элементов.

Пример

Код:

// Create a new ring of size 4
r := ring.New(4)

// Print out its length
fmt.Println(r.Len())

Вывод:

4

функция (*Ring) Link

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

Link соединяет кольца r и s так, что r.Next() становится равным s, и возвращает исходное значение r.Next(). Кольцо r не должно быть пустым.

Если r и s указывают на одно и то же кольцо, их соединение удаляет из кольца элементы между r и s. Удалённые элементы образуют подкольцо, а результатом становится ссылка на это подкольцо (если элементы не были удалены, результатом всё равно будет исходное значение r.Next(), а не nil).

Если r и s указывают на разные кольца, их соединение создаёт одно кольцо, вставляя элементы s после r. Результат указывает на элемент, следующий за последним элементом s после вставки.

Пример

Код:

// Create two rings, r and s, of size 2
r := ring.New(2)
s := ring.New(2)

// Get the length of the ring
lr := r.Len()
ls := s.Len()

// Initialize r with 0s
for i := 0; i < lr; i++ {
    r.Value = 0
    r = r.Next()
}

// Initialize s with 1s
for j := 0; j < ls; j++ {
    s.Value = 1
    s = s.Next()
}

// Link ring r and ring s
rs := r.Link(s)

// Iterate through the combined ring and print its contents
rs.Do(func(p any) {
    fmt.Println(p.(int))
})

Вывод:

0
0
1
1

функция (*Ring) Move

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

Move перемещается на n % r.Len() элементов назад (n < 0) или вперёд (n >= 0) по кольцу и возвращает соответствующий элемент кольца. Кольцо r не должно быть пустым.

Пример

Код:

// Create a new ring of size 5
r := ring.New(5)

// Get the length of the ring
n := r.Len()

// Initialize the ring with some integer values
for i := 0; i < n; i++ {
    r.Value = i
    r = r.Next()
}

// Move the pointer forward by three steps
r = r.Move(3)

// Iterate through the ring and print its contents
r.Do(func(p any) {
    fmt.Println(p.(int))
})

Вывод:

3
4
0
1
2

функция (*Ring) Next

func (r *Ring) Next() *Ring

Next возвращает следующий элемент кольца. Кольцо r не должно быть пустым.

Пример

Код:

// Create a new ring of size 5
r := ring.New(5)

// Get the length of the ring
n := r.Len()

// Initialize the ring with some integer values
for i := 0; i < n; i++ {
    r.Value = i
    r = r.Next()
}

// Iterate through the ring and print its contents
for j := 0; j < n; j++ {
    fmt.Println(r.Value)
    r = r.Next()
}

Вывод:

0
1
2
3
4

функция (*Ring) Prev

func (r *Ring) Prev() *Ring

Prev возвращает предыдущий элемент кольца. Кольцо r не должно быть пустым.

Пример

Код:

// Create a new ring of size 5
r := ring.New(5)

// Get the length of the ring
n := r.Len()

// Initialize the ring with some integer values
for i := 0; i < n; i++ {
    r.Value = i
    r = r.Next()
}

// Iterate through the ring backwards and print its contents
for j := 0; j < n; j++ {
    r = r.Prev()
    fmt.Println(r.Value)
}

Вывод:

4
3
2
1
0

функция (*Ring) Unlink

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

Unlink удаляет из кольца r элементы в количестве n % r.Len(), начиная с r.Next(). Если n % r.Len() == 0, кольцо r остаётся без изменений. Результатом является удалённое подкольцо. Кольцо r не должно быть пустым.

Пример

Код:

// Create a new ring of size 6
r := ring.New(6)

// Get the length of the ring
n := r.Len()

// Initialize the ring with some integer values
for i := 0; i < n; i++ {
    r.Value = i
    r = r.Next()
}

// Unlink three elements from r, starting from r.Next()
r.Unlink(3)

// Iterate through the remaining ring and print its contents
r.Do(func(p any) {
    fmt.Println(p.(int))
})

Вывод:

0
4
5

© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/container/ring/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API