golang中container/ring包用法

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.