Метод ring.Ring.Unlink
Метод ring.Ring.Unlink удаляет из кольцевого списка
определенное количество элементов, начиная со следующего за
текущим элемента. В качестве аргумента метод принимает
количество удаляемых элементов типа int. Метод
возвращает новый кольцевой список *ring.Ring,
содержащий удаленные элементы. Если удаление невозможно
(например, указано нулевое или отрицательное количество),
метод возвращает nil. Важно: сам текущий элемент
остается в исходном списке.
Синтаксис
unlinkedRing := ring.Unlink(n)
Пример
Создадим кольцевой список из пяти элементов и удалим из него два элемента, следующих за текущим:
package main
import (
"container/ring"
"fmt"
)
func main() {
r := ring.New(5)
for i := 0; i < r.Len(); i++ {
r.Value = i + 1
r = r.Next()
}
// Перемещаемся на элемент со значением 1
for r.Value != 1 {
r = r.Next()
}
// Удаляем 2 элемента после текущего
unlinked := r.Unlink(2)
// Выводим оставшийся список
r.Do(func(v interface{}) {
fmt.Println(v)
})
}
Результат выполнения кода:
1
4
5
Как видно из примера, после удаления элементов со значениями 2 и 3, в исходном кольцевом списке остались элементы 1, 4 и 5.
Пример
Давайте проверим, что возвращает метод Unlink.
Удалим два элемента и выведем полученный список:
package main
import (
"container/ring"
"fmt"
)
func main() {
r := ring.New(5)
for i := 0; i < r.Len(); i++ {
r.Value = i + 1
r = r.Next()
}
// Перемещаемся на элемент со значением 1
for r.Value != 1 {
r = r.Next()
}
// Удаляем 2 элемента после текущего
unlinked := r.Unlink(2)
// Выводим удаленные элементы
unlinked.Do(func(v interface{}) {
fmt.Println(v)
})
}
Результат выполнения кода:
2
3
Метод вернул новый кольцевой список, содержащий удаленные элементы. Обратите внимание, что порядок элементов сохраняется.
Пример
Рассмотрим поведение метода при попытке удалить нулевое количество элементов:
package main
import (
"container/ring"
"fmt"
)
func main() {
r := ring.New(3)
for i := 0; i < r.Len(); i++ {
r.Value = i + 1
r = r.Next()
}
// Пытаемся удалить 0 элементов
unlinked := r.Unlink(0)
if unlinked == nil {
fmt.Println("unlinked is nil")
} else {
fmt.Println("unlinked is not nil")
}
}
Результат выполнения кода:
"unlinked is nil"
При передаче нулевого или отрицательного значения метод
возвращает nil, так как удаление не производится.
Смотрите также
-
метод
ring.Ring.Link,
который объединяет два кольцевых списка -
метод
ring.Ring.Len,
который возвращает количество элементов в кольцевом списке -
метод
ring.Ring.Move,
который перемещает указатель на заданное количество элементов -
метод
ring.Ring.Next,
который возвращает следующий элемент кольцевого списка