Метод ring.Ring.Do

Метод ring.Ring.Do выполняет итерацию по всем элементам кольцевого списка (кольца) и применяет к каждому из них переданную функцию. В качестве параметра метод принимает функцию с сигнатурой func(interface{}), которая будет вызвана для значения каждого элемента. Обход начинается с текущего элемента и продолжается до возвращения к нему, охватывая таким образом все элементы кольца.

Синтаксис

gor.Do(func(v interface{}) {
  // обработка значения v
})

Пример

Давайте создадим кольцо из трех элементов и выведем значения каждого из них с помощью ring.Ring.Do:

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

  r.Do(func(v interface{}) {
    fmt.Println(v)
  })
}

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

go1
2
3

Пример

Рассмотрим пример, в котором мы собираем значения элементов кольца в слайс с помощью ring.Ring.Do:

gopackage main

import (
  "container/ring"
  "fmt"
)

func main() {
  r := ring.New(4)
  values := []string{"a", "b", "c", "d"}
  for i := 0; i < r.Len(); i++ {
    r.Value = values[i]
    r = r.Next()
  }

  var res []string
  r.Do(func(v interface{}) {
    res = append(res, v.(string))
  })

  fmt.Println(res)
}

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

go[a b c d]

Пример

А теперь применим функцию, которая изменяет значения элементов кольца на лету:

gopackage main

import (
  "container/ring"
  "fmt"
)

func main() {
  r := ring.New(3)
  for i := 0; i < r.Len(); i++ {
    r.Value = i * 10
    r = r.Next()
  }

  r.Do(func(v interface{}) {
    val := v.(int)
    fmt.Println(val + 5)
  })
}

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

go5
15
25

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

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