github.com/code-reading/golang@v0.0.0-20220303082512-ba5bc0e589a3/coding/container/04-ring-unlink.go (about)

     1  package main
     2  
     3  import (
     4  	"container/ring"
     5  	"fmt"
     6  )
     7  
     8  func main() {
     9  	// 初始化ring 长度为6
    10  	// 注意 ring 长度初始化之后就不能修改了, 扩容可以通过Link 另外一个ring 来达到目的
    11  	r := ring.New(6)
    12  
    13  	n := r.Len() // 获取ring的长度
    14  
    15  	//通过遍历初始化 ring
    16  	for i := 0; i < n; i++ {
    17  		r.Value = i
    18  		r = r.Next() // 通过Next() 移动ring
    19  	}
    20  	// 打印ring 查看当前的引用指针位置
    21  	r.Do(func(p interface{}) {
    22  		fmt.Printf("%v ", p)
    23  	})
    24  	// 上面初始化的长度位n , 然后ring的长度也是n
    25  	// 所以初始化结束之后 当前r的引用指针位置指向0
    26  	// output 0 1 2 3 4 5
    27  
    28  	fmt.Println()
    29  	// 删除元素 通过Unlink进行, 是从当前r 的下一个开始计算, 即从r.Next()开始
    30  	// Unlink three elements from r, starting from r.Next()
    31  	// 删除元素是从当前执行的下一个开始, 当前指针指向0 , r.Next() 是从1 开始 删除三个元素
    32  	// 就是把 1,2,3 删除了
    33  	r.Unlink(3)
    34  
    35  	// Iterate through the remaining ring and print its contents
    36  	r.Do(func(p interface{}) {
    37  		fmt.Printf("%v ", p)
    38  	})
    39  	// output 0 4 5
    40  }