培训首页  >  web前端新闻  >  兄弟连区块链教程Go语言标准容器源码分析

兄弟连区块链教程Go语言标准容器源码分析

[2018-08-23 14:46:53] 浏览量:60 来源:

北京兄弟连IT


  2018年时已过半,在今年的区块链热潮中,国内各家科技巨头均已粉墨登场,开始在这个新兴领域里抢占高地。但在具体布局细节上,几大巨头又各有不同,从中亦可窥见它们各自对区块链的重视程度和期许方向。

 

  兄弟连Go语言全栈与区块链技术培训课程是由清华、微软和谷歌名师历时半年时间研发出的独一无二的体系化课程。课程涵盖9大学习阶段,及多个企业级项目实战和来自世界顶尖区块链比赛作品,并由以微软区块链最具价值专家尹成为代表的清华系区块链团队亲临授课,综合提升学员的职场竞争力。

 

类似于Java的集合:listmapset等,Go语言中也提供了类似的标准容器,在标准包container包含了conatiner/listcontainer/heapcontainer/ring三种标准容器。

1conatiner/list 容器

conatiner/list源码包中提供了相关的示例,比如下面这个示例


list是一个双向的链表,可以添加类型不一的元素进来,它的相关类型说明如下所示:


初始化函数说明如下所示:


添加元素函数说明:可以添加类型不一的元素进来:


// 追加新元素到末尾,返回该元素指针

func (l *List) PushBack(v interface{}) *Element

// 追加另一个列表到末尾

func (l *List) PushBackList(other *List)

// 添加新元素到开头,返回该元素指针

func (l *List) PushFront(v interface{}) *Element

// 添加另一个列表到开头

func (l *List) PushFrontList(other *List)

// mark后面插入新元素,返回新元素指针

func (l *List) InsertAfter(v interface{}, mark *Element) *Element

// mark前插入新元素,返回新元素指针

func (l *List) InsertBefore(v interface{}, mark *Element) *Element

移除元素函数说明:emark都必须是l的内的元素,否则该函数不执行任何动作

 

// 移动emark之后

func (l *List) MoveAfter(e, mark *Element)

// 移动emark之前

func (l *List) MoveBefore(e, mark *Element)

// 移动e到末尾

func (l *List) MoveToBack(e *Element)

// 移动e到开头

func (l *List) MoveToFront(e *Element)

// 移除e,返回e的值

func (l *List) Remove(e *Element) interface{}

访问元素函数说明:

 

// 返回结尾元素

func (l *List) Back() *Element

// 返回开头元素

func (l *List) Front() *Element

遍历函数说明:

 

// Len返回列表l的元素数。

//复杂性是O1)。

func (l *List) Len() int { return l.len }

 

// Next返回下一个列表元素或nil

func (e *Element) Next() *Element

 

// Prev返回上一个列表元素或nil

func (e *Element) Prev() *Element

2conatiner/ ring 容器

关于ring 容器的函数说明与结构如下所示:

 

// Ring是循环列表或循环的元素。

type Ring struct {

    Value interface{} // 类型为interface{},因此可以接受任意类型

}

 

// 创建一个长度为n的环形链表

func New(n int) *Ring

 

// 针对环形链表中的每一个元素x进行f(x)操作

func (r *Ring) Do(f func(interface{}))

 

// 获取环形链表长度

func (r *Ring) Len() int

 

// 如果rs在同一环形链表中,则删除rs之间的元素

// 被删除的元素组成一个新的环形链表,返回值为该环形链表的指针(即删除前,r->Next()表示的元素)

// 如果rs不在同一个环形链表中,则将s插入到r后面,返回值为 插入s后,s最后一个元素的下一个元素(即插入前,r->Next()表示的元素)

func (r *Ring) Link(s *Ring) *Ring

 

// 移动 n % r.Len() 个位置,n正负均可

func (r *Ring) Move(n int) *Ring

 

// 返回下一个元素

func (r *Ring) Next() *Ring

 

// 返回前一个元素

func (r *Ring) Prev() *Ring

 

// 删除r后面的 n % r.Len() 个元素

func (r *Ring) Unlink(n int) *Ring

3conatiner/ heap 容器

conatiner/ heap 容器仅仅提供了最小堆的操作,然后由我们自己实现堆的数据结构(必须满足heap定义的接口),再利用heap包提供了一个heap.Interface接口做桥梁跟堆的操作搭上关系。

 

堆数据结构满足的接口定义:

 

type Interface interface {

   sort.Interface

   Push(x interface{}) // x添加为元素Len()

   Pop() interface{}   // 移除并返回元素的Len() - 1

}

 sort.Interface 的接口定义如下:

 

type Interface interface {

   // Len is the number of elements in the collection.

   Len() int

   // Less reports whether the element with

   // index i should sort before the element with index j.

   Less(i, j int) bool

   // Swap swaps the elements with indexes i and j.

   Swap(i, j int)

}

也就是说,如果我们让堆的数据结构与heap提供的堆操作搭上关系,就必须实现上面的五个方法。

 

heap包中还提供了下面几个函数的实现:

 

//必须先初始化堆,然后才能使用任何堆操作。 Init对于堆不变量是幂等的,并且可以在堆不变量可能被无效时被调用。

//其复杂度为On),其中n = h.Len()。

func Init(h Interface)

 

// Push将元素x推送到堆上。 复杂度为Ologn)),其中n = h.Len()。

func Push(h Interface, x interface{})

 

// Pop从堆中删除最小元素(根据Less)并返回它。 复杂度为Ologn)),其中n = h.Len()。

//相当于Removeh0)。

func Pop(h Interface) interface{}

 

// Remove从堆中删除索引i处的元素。

//复杂度为Ologn)),其中n = h.Len()。

func Remove(h Interface, i int)

 

//修复在索引i处的元素更改其值后重新建立堆排序。

//在索引i处更改元素的值,然后调用Fix,相当于调用Removehi),然后调用新值,相当于便宜。

//复杂度为Ologn)),其中n = h.Len()。

func Fix(h Interface, i int)

 

func up(h Interface, j int)

 

func down(h Interface, i0, n int) bool

高能预警,兄弟连教育区块链直播课程8月持续火爆来袭!

原价1188元的12节区块链进阶课程,现仅需1元!

还可免费领取《Go语言基础实战项目开发》与《Go语言高级实战项目开发》教材两本!!

限时限量!!先到先得!!

http://www.ydma.cn/open/course/24


关注兄弟连区块链技术公众号领取更多技术干货哦!!!



文中图片素材来源网络,如有侵权请联系删除
  • 软件开发
  • 软件测试
  • 数据库
  • Web前端
  • 大数据
  • 人工智能
  • 零基础
  • 有HTML基础
  • 有PHP基础
  • 有C语言基础
  • 有JAVA基础
  • 其他计算机语言基础
  • 周末班
  • 全日制白班
  • 随到随学

网上报名

热门信息