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 方法调用