Метод ring.Ring.Do
Метод ring.Ring.Do выполняет итерацию по всем элементам
кольцевого списка (кольца) и применяет к каждому из них
переданную функцию. В качестве параметра метод принимает
функцию с сигнатурой func(interface{}), которая будет
вызвана для значения каждого элемента. Обход начинается с
текущего элемента и продолжается до возвращения к нему,
охватывая таким образом все элементы кольца.
Синтаксис
r.Do(func(v interface{}) {
// обработка значения v
})
Пример
Давайте создадим кольцо из трех элементов и выведем
значения каждого из них с помощью ring.Ring.Do:
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()
}
r.Do(func(v interface{}) {
fmt.Println(v)
})
}
Результат выполнения кода:
1
2
3
Пример
Рассмотрим пример, в котором мы собираем значения элементов
кольца в слайс с помощью ring.Ring.Do:
package 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)
}
Результат выполнения кода:
[a b c d]
Пример
А теперь применим функцию, которая изменяет значения элементов кольца на лету:
package 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)
})
}
Результат выполнения кода:
5
15
25
Смотрите также
-
тип
ring.Ring,
представляющий узел кольцевого списка -
метод
ring.Ring.Next,
который возвращает следующий элемент кольца -
метод
ring.Ring.Len,
который возвращает количество элементов в кольце -
метод
ring.Ring.Link,
который связывает два кольцевых списка