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

     1  package main
     2  
     3  import (
     4  	"container/ring"
     5  	"fmt"
     6  )
     7  
     8  func main() {
     9  	// 一个空Ring
    10  	var rr ring.Ring
    11  	fmt.Printf("rr: %+v\n", rr)
    12  	// rr: {next:<nil> prev:<nil> Value:<nil>}
    13  
    14  	var rrr ring.Ring = ring.Ring{}
    15  	fmt.Printf("rrr: %+v\n", rrr)
    16  	// rrr: {next:<nil> prev:<nil> Value:<nil>}
    17  
    18  	// 可见空ring 其r.next == nil , 所以源码中多处比较r.next == nil 调用 init() 方法
    19  	// 是用于判断ring为空 然后初始化这个ring并返回
    20  
    21  	// 创建一个环, 包含三个元素
    22  	r := ring.New(3)
    23  	fmt.Printf("ring: %+v\n", *r)
    24  	// ring: {next:0xc000134020 prev:0xc000134040 Value:<nil>}
    25  
    26  	// 初始化
    27  	for i := 1; i <= 3; i++ {
    28  		r.Value = i
    29  		r = r.Next()
    30  	}
    31  	fmt.Printf("init ring: %+v\n", *r)
    32  	// init ring: {next:0xc000056040 prev:0xc000056060 Value:1}
    33  
    34  	// sum
    35  	s := 0
    36  	r.Do(func(i interface{}) {
    37  		fmt.Printf("%v ", i)
    38  		s += i.(int)
    39  	})
    40  	fmt.Printf("sum ring: %d\n", s)
    41  	// 1 2 3 sum ring: 6
    42  }
    43  
    44  // ring 方法的好处是 可以方便的通过ring.Do(func(interface{}){}) 将ring中的元素依次给func 方法调用