Categories: GoFrame 教程

GoFrame gring-方法介绍

以下常用方法列表,文档更新可能滞后于代码新特性,更多的方法及示例请参考代码文档:https://pkg.go.dev/github.com/gogf/gf/v2/container/gring

New

  • 说明:​New​创建并返回​cap​元素的环形结构。可选参数​safe​指定是否在并发安全中使用此结构,默认情况下为​false​。
  • 格式:
New(cap int, safe ...bool) *Ring
  • 示例:
func ExampleNew() {
 // Non concurrent safety
 gring.New(10)

 // Concurrent safety
 gring.New(10, true)

 // Output:
}

Val

  • 说明:​Val​返回当前位置的值。
  • 格式:
Val() interface{}
  • 示例:
func ExampleRing_Val() {
 r := gring.New(10)
 r.Set(1)
 fmt.Println("Val:", r.Val())

 r.Next().Set("GoFrame")
 fmt.Println("Val:", r.Val())

 // Output:
 // Val: 1
 // Val: GoFrame
}

Len

  • 说明:​Len​返回​Ring​的大小。
  • 格式:
Len() int
  • 示例:
func ExampleRing_Len() {
 r1 := gring.New(10)
 for i := 0; i < 5; i++ {
  r1.Set(i).Next()
 }
 fmt.Println("Len:", r1.Len())

 r2 := gring.New(10, true)
 for i := 0; i < 10; i++ {
  r2.Set(i).Next()
 }
 fmt.Println("Len:", r2.Len())

 // Output:
 // Len: 5
 // Len: 10
}

Cap

  • 说明:​Cap​返回​Ring​的容量。
  • 格式:
Cap() int
  • 示例:
func ExampleRing_Cap() {
 r1 := gring.New(10)
 for i := 0; i < 5; i++ {
  r1.Set(i).Next()
 }
 fmt.Println("Cap:", r1.Cap())

 r2 := gring.New(10, true)
 for i := 0; i < 10; i++ {
  r2.Set(i).Next()
 }
 fmt.Println("Cap:", r2.Cap())

 // Output:
 // Cap: 10
 // Cap: 10
}

Set

  • 说明:​Set​将为当前位置的值设置为​Value​。
  • 格式:
Set(value interface{}) *Ring
  • 示例:
func ExampleRing_Set() {
 r := gring.New(10)
 r.Set(1)
 fmt.Println("Val:", r.Val())

 r.Next().Set("GoFrame")
 fmt.Println("Val:", r.Val())

 // Output:
 // Val: 1
 // Val: GoFrame
}

Put

  • 说明:​Put​将为当前位置的值设置为​Value​,并将​ring​移动到下一个位置。
  • 格式:
Put(value interface{}) *Ring
  • 示例:
func ExampleRing_Put() {
 r := gring.New(10)
 r.Put(1)
 fmt.Println("Val:", r.Val())
 fmt.Println("Val:", r.Prev().Val())

 // Output:
 // Val: <nil>
 // Val: 1
}

Move

  • 说明:正向或者逆向移动​n % r.Len()​个节点,并返回移动后指向的位置。当n>=0时,为正向移动,反之为反向移动。
  • 格式:
Move(n int) *Ring
  • 示例:
func ExampleRing_Move() {
 r := gring.New(10)
 for i := 0; i < 10; i++ {
  r.Set(i).Next()
 }
 // ring at Pos 0
 fmt.Println("CurVal:", r.Val())

 r.Move(5)

 // ring at Pos 5
 fmt.Println("CurVal:", r.Val())

 // Output:
 // CurVal: 0
 // CurVal: 5
}

Prev

  • 说明:​Prev​返回​ring​上一个位置的元素。
  • 格式:
Prev() *Ring
  • 示例:
func ExampleRing_Prev() {
 r := gring.New(10)
 for i := 0; i < 5; i++ {
  r.Set(i).Next()
 }

 fmt.Println("Prev:", r.Prev().Val())
 fmt.Println("Prev:", r.Prev().Val())

 // Output:
 // Prev: 4
 // Prev: 3
}

Next

  • 说明:​Next ​返回​ring​下一个位置的元素。
  • 格式:
Next() *Ring
  • 示例:
func ExampleRing_Next() {
 r := gring.New(10)
 for i := 5; i > 0; i-- {
  r.Set(i).Prev()
 }

 fmt.Println("Prev:", r.Next().Val())
 fmt.Println("Prev:", r.Next().Val())

 // Output:
 // Prev: 1
 // Prev: 2
}

Link

  • 说明:
  1. Link​将​ring r​与​ring s​连接起来,使​r.Next()​变为​s​并返回​r.Next()​的原始值。​r​不能为空。​Link​后,​ring r​的​Len​和​Cap​会变为原始​r​和​s​的​Len​和​Cap​之和。
  2. 如果​r​和​s​指向同一个​ring​,则连接它们将从​ring​中删除​r​和​s​之间的元素。移除的元素形成一个子​ring​,结果是对该子​ring​的引用(如果没有移除任何元素,则结果仍然是​r.Next()​的原始值,而不是​nil​)。
  3. 如果​r​和​s​指向不同的​ring​,则连接它们将创建一个​ring​,其中​s​的元素插入​r​之后。结果指向插入后​s​的最后一个元素后面的元素。
  • 格式:
(r *Ring) Link(s *Ring) *Ring
  • 示例:
func ExampleRing_Link_Common() {
 r := gring.New(10)
 for i := 0; i < 5; i++ {
  r.Set(i).Next()
 }

 s := gring.New(10)
 for i := 0; i < 10; i++ {
  val := i + 5
  s.Set(val).Next()
 }

 r.Link(s) // Link Ring s to Ring r

 fmt.Println("Len:", r.Len())
 fmt.Println("Cap:", r.Cap())
 fmt.Println(r.SlicePrev())
 fmt.Println(r.SliceNext())

 // Output:
 // Len: 15
 // Cap: 20
 // [4 3 2 1 0]
 // [5 6 7 8 9 10 11 12 13 14]
}
func ExampleRing_Link_SameRing() {
 r := gring.New(10)
 for i := 0; i < 5; i++ {
  r.Set(i).Next()
 }

 same_r := r.Link(r.Prev())

 fmt.Println("Len:", same_r.Len())
 fmt.Println("Cap:", same_r.Cap())
 fmt.Println(same_r.SlicePrev())
 fmt.Println(same_r.SliceNext())

 // Output:
 // Len: 1
 // Cap: 1
 // [4]
 // [4]
}

Unlink

  • 说明:​Unlink​从​r.next()​开始,从​ring​中删除​n % r.len()​个元素。如果​n % r.len() == 0​,则​ring​保持不变。返回值为删除的​subring​。
  • 格式:
Set(value interface{}) *Ring
  • 示例:
func ExampleRing_Unlink() {
 r := gring.New(10)
 for i := 0; i < 10; i++ {
  r.Set(i).Next()
 }

 fmt.Println("Before Unlink, Len:", r.Len())
 fmt.Println("Before Unlink, Cap:", r.Cap())
 fmt.Println("Before Unlink, ", r.SlicePrev())
 fmt.Println("Before Unlink, ", r.SliceNext())

 r.Unlink(7)

 fmt.Println("After Unlink, Len:", r.Len())
 fmt.Println("After Unlink, Cap:", r.Cap())
 fmt.Println("After Unlink, ", r.SlicePrev())
 fmt.Println("After Unlink, ", r.SliceNext())

 // Output:
 // Before Unlink, Len: 10
 // Before Unlink, Cap: 10
 // Before Unlink,  [0 9 8 7 6 5 4 3 2 1]
 // Before Unlink,  [0 1 2 3 4 5 6 7 8 9]
 // After Unlink, Len: 7
 // After Unlink, Cap: 7
 // After Unlink,  [1 7 6 5 4 3 2]
 // After Unlink,  [1 2 3 4 5 6 7]
}

RLockIteratorNext

  • 说明:​RLockIteratorNext​在​RWMutex.RLock​中迭代的回调给定的​func f​进行正向读取。如果​fun f​返回​true​,则继续迭代;如果返回​false​则停止。
  • 格式:
RLockIteratorNext(f func(value interface{}) bool)
  • 示例:
func ExampleRing_RLockIteratorNext() {
 r := gring.New(10)
 for i := 0; i < 10; i++ {
  r.Set(i).Next()
 }

 r.RLockIteratorNext(func(value interface{}) bool {
  if value.(int) < 5 {
   fmt.Println("IteratorNext Success, Value:", value)
   return true
  }

  return false
 })

 // Output:
 // IteratorNext Success, Value: 0
 // IteratorNext Success, Value: 1
 // IteratorNext Success, Value: 2
 // IteratorNext Success, Value: 3
 // IteratorNext Success, Value: 4
}

RLockIteratorPrev

  • 说明:​RLockIteratorPrev​在​RWMutex.RLock​中迭代的回调给定的​func f​进行反向读取。如果​fun f​返回​true​,则继续迭代;如果返回​false​则停止。
  • 格式:
RLockIteratorPrev(f func(value interface{}) bool)
  • 示例:
func ExampleRing_RLockIteratorPrev() {
 r := gring.New(10)
 for i := 0; i < 10; i++ {
  r.Set(i).Next()
 }

 // move r to pos 9
 r.Prev()

 r.RLockIteratorPrev(func(value interface{}) bool {
  if value.(int) >= 5 {
   fmt.Println("IteratorPrev Success, Value:", value)
   return true
  }

  return false
 })

 // Output:
 // IteratorPrev Success, Value: 9
 // IteratorPrev Success, Value: 8
 // IteratorPrev Success, Value: 7
 // IteratorPrev Success, Value: 6
 // IteratorPrev Success, Value: 5
}

SliceNext

  • 说明:​SliceNext​以​slice​的形式返回从当前位置向后所有元素的值的副本。
  • 格式:
SliceNext() []interface{}
  • 示例:
func ExampleRing_SliceNext() {
 r := gring.New(10)
 for i := 0; i < 10; i++ {
  r.Set(i).Next()
 }

 fmt.Println(r.SliceNext())

 // Output:
 // [0 1 2 3 4 5 6 7 8 9]
}

SlicePrev

  • 说明:​SlicePrev​以​slice​的形式返回从当前位置向前所有元素的值的副本。
  • 格式:
SlicePrev() []interface{}
  • 示例:
func ExampleRing_SlicePrev() {
 r := gring.New(10)
 for i := 0; i < 10; i++ {
  r.Set(i).Next()
 }

 fmt.Println(r.SlicePrev())

 // Output:
 // [0 9 8 7 6 5 4 3 2 1]
}

冒牌SEO

前端开发者,欢迎大家一起沟通和交流。

Share
Published by
冒牌SEO

Recent Posts

聊聊vue3中的defineProps

在Vue 3中,defineP…

1 周 ago

在 Chrome 中删除、允许和管理 Cookie

您可以选择删除现有 Cooki…

2 周 ago

自定义指令:聊聊vue中的自定义指令应用法则

今天我们来聊聊vue中的自定义…

3 周 ago

聊聊Vue中@click.stop和@click.prevent

一起来学下聊聊Vue中@cli…

4 周 ago

Nginx 基本操作:启动、停止、重启命令。

我们来学习Nginx基础操作:…

1 月 ago

Vue3:手动清理keep-alive组件缓存的方法

Vue3中手动清理keep-a…

1 月 ago