今天,Mayuyu 将介绍Go 语言中非常重要的容器。具体源码请参考下面的Go语言源码。
路径:/usr/local/go/src/pkg/container
Github上的路径是:https://github.com/astaxie/gopkg/tree/master/container
容器的结构如下所示
可以看到它包含三个部分:堆、列表和环。下面我就来介绍一下
1. 堆
堆是一种常用的数据结构,它在源代码中提供了实际使用时必须实现的接口。
下面是堆使用的示例。
代码:
package mainimport (‘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 () 接口{} { x :=( *h) [h.Len() – 1] *h=(*h)[: h.Len() – 1] return x}func (h *Heap) Push( x 接口{}) { *h=追加(*h , x.(int))}func (h *Heap) Remove(idx int) 接口{} { h.Swap(idx, h.Len) () – 1) return h.Pop()}func main (){ //创建堆h :=Heap{} heap.Init(h) //向堆中插入元素h.Push(5) h.Push(2) h.Push(1) h.Push(8 ) h. Push(4) h.Push(6) h.Push(2) //输出数组对应的堆中的元素,即原始数组。 fmt.Println(h) //这里需要reheapify,建立堆heap.Init(h) //数组中小上堆对应的元素位置fmt.Println(h) //下标为5个元素,索引从0开始h.Remove(5) //h.Len() 以堆格式输出0 { fmt.Printf(‘%d ‘, heap.Pop(h)) } fmt. Println()} :010 -69502
2. 清单
列表的类型是双向链表,具体用法如下。
代码:
package mainimport ( ‘fmt’ ‘container/list’ )func main(){ //创建双向链表ls :=list.New() //在双向链表中插入26个小写字母for i :=97; i++ { ls.PushFront(i) //PushFront()表示从头插入,PushBack()表示从尾插入} //将所有字符放入双向链表Scan ls :=ls.Front( );=nil; it=it.Next() { fmt.Printf(‘%c ‘, it.Value) } fmt.Println()}
3.戒指
Ring是一个循环链表。具体使用请看下面的代码。
代码:
package mainimport (‘fmt’ ‘container/ring’ //闭环包概述,参见/usr/local/go/src/pkg/container/ring)func main(){ //创建闭环r为10 elements :=ring.New(10) //给闭环中的元素赋值for i :=1; i=r.Len(); i++ { r.Value=i r=r.Next() }//在闭环中循环遍历元素并打印它们。 Value 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)}
本文来自博客园,作者:孙龙-程序员,如需转载,请提供原文链接:https://www.cnblogs.com/sunlong88/p/13475647.html
原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/81637.html