Метод ring.Ring.Unlink

Метод ring.Ring.Unlink удаляет из кольцевого списка определенное количество элементов, начиная со следующего за текущим элемента. В качестве аргумента метод принимает количество удаляемых элементов типа int. Метод возвращает новый кольцевой список *ring.Ring, содержащий удаленные элементы. Если удаление невозможно (например, указано нулевое или отрицательное количество), метод возвращает nil. Важно: сам текущий элемент остается в исходном списке.

Синтаксис

gounlinkedRing := ring.Unlink(n)

Пример

Создадим кольцевой список из пяти элементов и удалим из него два элемента, следующих за текущим:

gopackage 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)
  })
}

Результат выполнения кода:

go1
4
5

Как видно из примера, после удаления элементов со значениями 2 и 3, в исходном кольцевом списке остались элементы 1, 4 и 5.

Пример

Давайте проверим, что возвращает метод Unlink. Удалим два элемента и выведем полученный список:

gopackage 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)
  })
}

Результат выполнения кода:

go2
3

Метод вернул новый кольцевой список, содержащий удаленные элементы. Обратите внимание, что порядок элементов сохраняется.

Пример

Рассмотрим поведение метода при попытке удалить нулевое количество элементов:

gopackage 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")
  }
}

Результат выполнения кода:

go"unlinked is nil"

При передаче нулевого или отрицательного значения метод возвращает nil, так как удаление не производится.

Смотрите также

  • метод ring.Ring.Link,
    который объединяет два кольцевых списка
  • метод ring.Ring.Len,
    который возвращает количество элементов в кольцевом списке
  • метод ring.Ring.Move,
    который перемещает указатель на заданное количество элементов
  • метод ring.Ring.Next,
    который возвращает следующий элемент кольцевого списка