golang提供的List

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


作為現代10後語言的golang(12年正式發布)。Golang的標準庫提供了進階的資料結構List。具體在包container/list。該包裡主要有兩個資料結構組成:“Element”、“List”。其中“Element”相當於CPP裡面的"iterator",其有Prev和Next方法用於得到前一個或者下一個迭代器,迭代器的間接引用直接使用其成員Value。

1 建立一個List對象來感受一下

l聽:=聽list.New()l.PushBack("one")l.PushBack(2)fmt.Println(l)

上面的代碼可以得到如下的輸出:

&{{0x2081a21b0聽0x2081a21e0聽<nil>聽?reflect.Value?}聽2}

這裡具體的0x資料可能會變動,其實際記錄的是對象的地址,但是最後的“2”不會變動,其表示當前的list對象裡面有兩個元素。

這裡我們通過使用聽list.New()聽建立一個list對象,然後調用該對象的PushBack()方法向list對象中插入一個元素。這裡我們發現神奇的一個現象:在CPP裡面,list的成員的必須是同一個類型的,但是我們的Golang卻允許list中插入任意類型的成員。這個很容易讓我們想到了python的特性。這裡我們可以通過源碼瞭解到Element中其實儲存的是一個聽interface{}聽成員,從而支援任意成員的特性:

type聽Element聽struct聽{//聽The聽value聽stored聽with聽this聽element.Value聽interface{}//聽contains聽filtered聽or聽unexported聽fields}

2.遍曆list

上面的例子,僅僅用fmt.Println看到了list得簡單的資訊,那麼若要遍曆整個list怎麼操作呢?來看代碼:

l聽:=聽list.New()l.PushBack("one")l.PushBack(2)l.PushBack("three")for聽iter聽:=聽l.Front();iter聽!=聽nil聽;iter聽=聽iter.Next()聽{聽聽聽聽fmt.Println("item:",iter.Value)}

運行代碼,我們可以看到結果:

item:聽oneitem:聽2item:聽three

這裡,我們定義了一個迭代器變數iter,其為Element類型,通過調用list的聽Front()函數,可以得到list的第一個對象,若list為空白,則得到nil。同樣的通過調用調用list的Back()可以得到最後一個對象的迭代器。在for語句中,我們用list的Next()方法得到當前迭代器的下一個元素的迭代器,若沒有元素了,則返回nil。因此我們用聽iter !=nil作為迴圈結束條件。上面說了。通過引用迭代器的Value成員,可以實現對其記憶體儲元素的間接應用。

除了可以通過上面的函數得到單個元素外,我們還可以通過list的Len()函數獲得其內元素的個數。美中不足的是Golang的List沒有提供python中得通過索引引用元素的功能,也沒有index或者at類似的介面

3.修改list的成員

在上面的例子中,我們已經示範了怎麼向list中添加元素。PushBack()會將新元素添加到list的尾部。除此之外,還有PushFront()可以將元素插入到list得首部。InsertAfter()能將元素插入到list中指定元素的後面,InsertBefor能將元素插入到list中指定的元素的前面。

插入後如何刪除元素呢?通過list的Remove()函數可以刪除指定的元素。與Insert對應的MoveAfter()MoveBefore(),可以list中指定元素的後面或者前面的元素。

我們來看一個執行個體。用這幾個介面組合成一個Queue的執行個體:

type聽Queue聽struct聽{聽聽聽聽data聽*list.List}func聽NewQueue()聽*Queue聽{聽聽聽聽q聽:=聽new(Queue)聽聽聽聽q.data聽=聽list.New()聽聽聽聽return聽q}func聽(q聽*Queue)Enqueue(v聽interface{})聽{聽聽聽聽q.data.PushBack(v)}func聽(q聽*Queue)Dequeue()聽interface{}聽{聽聽聽聽iter聽:=聽q.data.Front()聽聽聽聽v聽:=聽iter.Value聽聽聽聽q.data.Remove(iter)聽聽聽聽return聽v}func聽(q聽*Queue)聽Dump(){聽聽聽聽for聽iter:=q.data.Front();iter!=nil;iter=iter.Next()聽{聽聽聽聽聽聽聽聽fmt.Println("item:",iter.Value)聽聽聽聽}}func聽main(){聽聽聽聽q聽:=聽NewQueue()聽聽聽聽q.Enqueue("one")聽聽聽聽q.Enqueue("two")聽聽聽聽q.Dump()聽聽聽聽v聽:=聽q.Dequeue()聽聽聽聽fmt.Println("v:",v)聽聽聽聽q.Dump()}

我們可以看到結果為:

item:聽oneitem:聽twov:聽oneitem:聽two

最後。如果我們想清空list。可以調用其Init()聽介面。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.