這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
ring包實現了環形鏈表的操作。
type Ring //Ring類型代表環形鏈表的一個元素,同時也代錶鏈表本身。環形鏈表沒有頭尾;指向環形鏈表任一元素的指標都可以作為整個環形鏈表看待。Ring零值是具有一個(Value欄位為nil的)元素的鏈表。
type Ring struct { Value interface{} // 供調用者使用,本包不會對該值進行操作 // 包含未匯出欄位}
func New(n int) *Ring //建立一個長度為n的環形鏈表
func (r *Ring) Do(f func(interface{})) //對鏈表中任意元素執行f操作,如果f改變了r,則該操作造成的後果是不可預期的。
func (r *Ring) Len() int //求環長度,返迴環中元素數量
func (r *Ring) Link(s *Ring) *Ring //Link串連r和s,並返回r原本的後繼元素r.Next()。r不可為空。
如果r和s指向同一個環形鏈表,則會刪除掉r和s之間的元素,刪掉的元素構成一個子鏈表,返回指向該子鏈表的指標(r的原後繼元素);如果沒有刪除元素,則仍然返回r的原後繼元素,而不是nil。如果r和s指向不同的鏈表,將建立一個單獨的鏈表,將s指向的鏈表插入r後面,返回s原最後一個元素後面的元素(即r的原後繼元素)。
func (r *Ring) Unlink(n int) *Ring //刪除鏈表中n % r.Len()個元素,從r.Next()開始刪除。如果n % r.Len() == 0,不修改r。返回刪除的元素構成的鏈表,r不可為空。
func (r *Ring) Move(n int) *Ring //返回移動n個位置(n>=0向前移動,n<0向後移動)後的元素,r不可為空。
func (r *Ring) Next() *Ring //擷取當前元素的下個元素
func (r *Ring) Prev() *Ring //擷取當前元素的上個元素
舉例說明其用法:
package mainimport ("container/ring""fmt")func main() {RingFunc()}func RingFunc() {r := ring.New(10) //初始長度10for i := 0; i < r.Len(); i++ {r.Value = ir = r.Next()}for i := 0; i < r.Len(); i++ {fmt.Println(r.Value)r = r.Next()}r = r.Move(6)fmt.Println(r.Value) //6r1 := r.Unlink(19) //移除19%10=9個元素for i := 0; i < r1.Len(); i++ {fmt.Println(r1.Value)r1 = r1.Next()}fmt.Println(r.Len()) //10-9=1fmt.Println(r1.Len()) //9}
參考:https://golang.org/pkg/container/ring/