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 удаляет n % r.Len() элементов из кольца r, начиная с 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