golang container,go 语言

天,Mayuyu来介绍Go语言中一个重要的东西,叫做container。具体源码可以参考Go语言的源代码,如下路径:/usr/local/go/src/pkg/

今天,Mayuyu 将介绍Go 语言中非常重要的容器。具体源码请参考下面的Go语言源码。

路径:/usr/local/go/src/pkg/container

Github上的路径是:https://github.com/astaxie/gopkg/tree/master/container

容器的结构如下所示

d42152aa2a3f44dfad98887f9f039a2f~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717734957&x-signature=tMTVWJ1aEmxhl%2BRkvaP0uy5Q24I%3D

可以看到它包含三个部分:堆、列表和环。下面我就来介绍一下

1. 堆

堆是一种常用的数据结构,它在源代码中提供了实际使用时必须实现的接口。

下面是堆使用的示例。

代码:

9985b834cd7947c8937610cc68712d12~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717734957&x-signature=2H36l27D5Aadp%2Bd6FIriNMYlGpQ%3D

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. 清单

列表的类型是双向链表,具体用法如下。

代码:

28e89f13d5954fd2b13e6a18579055c5~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717734957&x-signature=kwGwRjP7FW83tYkY4I0%2FRxvoBN8%3D

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()} 6430f16e0ff9430d89c27f318a93ec6c~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717734957&x-signature=cJqyGnxaZMs5%2FgIHF22n3UPy9bg%3D

3.戒指

Ring是一个循环链表。具体使用请看下面的代码。

代码:

53eb1115db7c47b6af7a7366749b0a49~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717734957&x-signature=L9fASWfo4i1Z3vECl2LJwB%2Fo%2Fl4%3D

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)} cc9874551954437688966ff551b83879~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717734957&x-signature=CQ0PDV2N4KMDBzFDg4SAmnPR5Q8%3D

本文来自博客园,作者:孙龙-程序员,如需转载,请提供原文链接:https://www.cnblogs.com/sunlong88/p/13475647.html

原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/81637.html

(0)
小条's avatar小条
上一篇 2024年5月31日 下午12:30
下一篇 2024年5月31日 下午12:36

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注