GoFrame gring-方法介紹

2022-04-08 17:15 更新

以下常用方法列表,文檔更新可能滯后于代碼新特性,更多的方法及示例請(qǐng)參考代碼文檔:https://pkg.go.dev/github.com/gogf/gf/v2/container/gring

New

  • 說明:?New?創(chuàng)建并返回?cap?元素的環(huán)形結(jié)構(gòu)??蛇x參數(shù)?safe?指定是否在并發(fā)安全中使用此結(jié)構(gòu),默認(rèn)情況下為?false?。
  • 格式:
New(cap int, safe ...bool) *Ring
  • 示例:
func ExampleNew() {
	// Non concurrent safety
	gring.New(10)

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

	// Output:
}

Val

  • 說明:?Val?返回當(dāng)前位置的值。
  • 格式:
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?將為當(dāng)前位置的值設(shè)置為?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?將為當(dāng)前位置的值設(shè)置為?Value?,并將?ring?移動(dòng)到下一個(gè)位置。
  • 格式:
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

  • 說明:正向或者逆向移動(dòng)?n % r.Len()?個(gè)節(jié)點(diǎn),并返回移動(dòng)后指向的位置。當(dāng)n>=0時(shí),為正向移動(dòng),反之為反向移動(dòng)。
  • 格式:
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?上一個(gè)位置的元素。
  • 格式:
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?下一個(gè)位置的元素。
  • 格式:
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()?變?yōu)?s?并返回?r.Next()?的原始值。?r?不能為空。?Link?后,?ring r?的?Len?和?Cap?會(huì)變?yōu)樵?r?和?s?的?Len?和?Cap?之和。
    2. 如果?r?和?s?指向同一個(gè)?ring?,則連接它們將從?ring?中刪除?r?和?s?之間的元素。移除的元素形成一個(gè)子?ring?,結(jié)果是對(duì)該子?ring?的引用(如果沒有移除任何元素,則結(jié)果仍然是?r.Next()?的原始值,而不是?nil?)。
    3. 如果?r?和?s?指向不同的?ring?,則連接它們將創(chuàng)建一個(gè)?ring?,其中?s?的元素插入?r?之后。結(jié)果指向插入后?s?的最后一個(gè)元素后面的元素。
  • 格式:
(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()?個(gè)元素。如果?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?中迭代的回調(diào)給定的?func f?進(jìn)行正向讀取。如果?fun f?返回?true?,則繼續(xù)迭代;如果返回?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?中迭代的回調(diào)給定的?func f?進(jìn)行反向讀取。如果?fun f?返回?true?,則繼續(xù)迭代;如果返回?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?的形式返回從當(dāng)前位置向后所有元素的值的副本。
  • 格式:

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?的形式返回從當(dāng)前位置向前所有元素的值的副本。 
  • 格式:

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]
}


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)