這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
作為現代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()聽介面。