Пакет ring
Обзор
Пакет ring реализует операции с циклическими списками.
Индекс
Файлы пакета
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/