本文來自:CSDN博客
感謝作者:ACHelloWorld
查看原文:Go語言(container介紹)
container:容器 | container
可以看出包含三部分:heap,list和ring。下面分別介紹
1. heap
heap即為堆,是一種常用的數據結構,在源碼里面,提供了接口,在實際使用時需要實現。
下面是一個關於heap使用的實例。
代碼:
package main import ( "fmt" "container/heap" ) //heap提供了接口,需要自己實現如下方法 type Heap []int //構造的是小頂堆,大頂堆只需要改一下下面的符號 func (h *Heap) Less(i, j int) bool { return (*h)[i] < (*h)[j] } func (h *Heap) Swap(i, j int) { (*h)[i], (*h)[j] = (*h)[j], (*h)[i] } func (h *Heap) Len() int { return len(*h) } func (h *Heap) Pop() interface{} { x := (*h)[h.Len() - 1] *h = (*h)[: h.Len() - 1] return x } func (h *Heap) Push(x interface{}) { *h = append(*h, x.(int)) } func (h *Heap) Remove(idx int) interface{} { h.Swap(idx, h.Len() - 1) return h.Pop() } func main(){ //創建一個heap h := &Heap{} heap.Init(h) //向heap中插入元素 h.Push(5) h.Push(2) h.Push(1) h.Push(8) h.Push(4) h.Push(6) h.Push(2) //輸出heap中的元素,相當於一個數組,原始數組 fmt.Println(h) //這里必須要reheapify,建立好堆了 heap.Init(h) //小頂堆對應的元素在數組中的位置 fmt.Println(h) //移除下標為5的元素,下標從0開始 h.Remove(5) //按照堆的形式輸出 for h.Len() > 0 { fmt.Printf("%d ", heap.Pop(h)) } fmt.Println() }
2. list
list類型是雙向鏈表,具體用法如下
代碼:
package main import ( "fmt" "container/list" ) func main(){ //創建一個雙向鏈表 ls := list.New() //向雙向鏈表中插入26個小寫字母 for i := 97; i < 123; i++ { ls.PushFront(i) //PushFront()代表從頭部插入,同樣PushBack()代表從尾部插入 } //遍歷雙向鏈表ls中的所有字母 for it := ls.Front(); it != nil; it = it.Next() { fmt.Printf("%c ", it.Value) } fmt.Println() }
List
和Element
。前者實現了一個雙向鏈表(以下簡稱鏈表),而后者則代表了鏈表中元素的結構。
List
和Element
都是結構體類型。結構體類型有一個特點,那就是它們的零值都會是擁有其特定結構,但沒有任何定制化內容的值,相當於一個空殼
List的主要方法:
MoveBefore
:給定的元素移動到另一個元素的前面
MoveAfter
:給定的元素移動到另一個元素的后面
MoveToFront
:把給定的元素移動到鏈表的最前端
MoveToBack
:把給定的元素移動到鏈表的最后端
Front
:獲取鏈表中最前端
Back
:獲取鏈表中最后端
InsertBefore
:指定的元素之前插入新元素
InsertAfter
:指定的元素之后插入新元素
PushFront
:用於在鏈表的最前端插入新元素。
PushBack
:用於在鏈表的最前端插入新元素。
3. ring
ring是一個環形鏈表,具體用法可以參考如下代碼
代碼:
package main import ( "fmt" "container/ring" //閉環包引入,詳見/usr/local/go/src/pkg/container/ring ) func main(){ //創建10個元素的閉環 r := ring.New(10) //給閉環中的元素賦值 for i := 1; i <= r.Len(); i++ { r.Value = i r = r.Next() } //循環打印閉環中的元素值 r.Do( func(p interface{}){ println(p) }) //獲得當前元素之后的第5個元素 r5 := r.Move(5) fmt.Println(r5) fmt.Println(r) //鏈接當前元素r與r5,相當於刪除了r與r5之間的元素 r1 := r.Link(r5) fmt.Println(r1) fmt.Println(r) }