golang提供的List

作为现代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: one
item: 2
item: 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: one
item: two
v: one
item: two

最后。如果我们想清空list。可以调用其Init() 接口。

golang提供的List,布布扣,bubuko.com

时间: 2024-10-20 03:31:16

golang提供的List的相关文章

Java程序员的Golang入门指南(上)

Java程序员的Golang入门指南 1.序言 Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis.类Evernote的云笔记leanote等. 1.1 为什么要学习 如果有人说X语言比Y语言好,两方的支持者经常会激烈地争吵.如果你是某种语言老手,你就是那门语言的"传道者",下意识地会保护它.无论承认与否,你都已被困在一个隧道里,你看到的完全是局限的.<肖申克的救赎>对此有很好的注脚: [Red] These walls are funny.

GoLang几种读文件方式的比较

GoLang提供了很多读文件的方式,一般来说常用的有三种.使用Read加上buffer,使用bufio库和ioutil 库. 那他们的效率如何呢?用一个简单的程序来评测一下: package main import(    "fmt"     "os"     "flag"     "io"     "io/ioutil"     "bufio"     "time"

Golang中使用heap编写一个简单高效的定时器模块

定时器模块在服务端开发中非常重要,一个高性能的定时器模块能够大幅度提升引擎的运行效率.使用Golang和heap实现一个通用的定时器模块,代码来自:https://github.com/xiaonanln/goTimer 也可以查看文档:http://godoc.org/github.com/xiaonanln/goTimer,下面是完整的代码,并进行适当的注释和分析. 从性能测试结果来看,基于heap的定时器模块在效率上并不会比时间轮(TimeWheel)的实现慢多少,但是逻辑上要简单很多.

golang 模板(template)的常用基本语法

在写动态页面的网站的时候,我们常常将不变的部分提出成为模板,可变部分通过后端程序的渲染来生成动态网页,golang提供了html/template包来支持模板渲染. 这篇文章不讨论golang后端的模板读取及渲染方法,只讨论模板中嵌入变量,渲染变量.循环等一些基本用法. 变量 在golang渲染template的时候,可以接受一个interface{}类型的变量,我们在模板文件中可以读取变量内的值并渲染到模板里. 有两个常用的传入参数的类型.一个是struct,在模板内可以读取该struct域的

GOLANG SDK下载

如果没有FQ的话是不能访问国外网站的,但是golang提供了中国站点,要下载sdk可以在中国站点下载 中国站点: http://www.golangtc.com/download

Golang使用pprof和qcachegrind进行性能监控

Golang为我们提供了非常方便的性能测试工具pprof,使用pprof可以非常方便地对Go程序的运行效率进行监测.本文讲述如何使用pprof对Go程序进行性能测试,并使用qcachegrind查看性能测试的输出文件. 载入pprof模块 想要对一个Go程序进行pprof监测,第一步是在main函数所在的模块中添加 net/http/pprof 模块.import后面的“_”是一定要加上的. import _ "net/http/pprof" 运行HTTP服务器 如果你的程序不是一个W

Golang后台开发初体验

转自:http://blog.csdn.net/cszhouwei/article/details/37740277 补充反馈 slice 既然聊到slice,就不得不提它的近亲array,这里不太想提值类型和引用类型的概念(个人觉得其实都是值类型),golang的array其实可以假想为C的struct类型,只是struct通过变量名来访问成员(如xxx.yyy),而array通过下标来访问成员(如xxx[3]),具体内存布局如下图所示: 图 1 golang的array内存布局 显然gola

golang并发编程

golang并发编程 引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止goroutine将资源耗尽.以下面伪代码为例,看看goroutine如何拖垮一台DB.假设userList长度为10000,先从数据库中查询userList中的user是否在数据库中存在,存在则忽略,不存在则创建. //不使用goroutine,程序运行时间长,但数据库压力不大 for _,v:=ra

Golang 微框架 Gin 简介

框架一直是敏捷开发中的利器,能让开发者很快的上手并做出应用,甚至有的时候,脱离了框架,一些开发者都不会写程序了.成长总不会一蹴而就,从写出程序获取成就感,再到精通框架,快速构造应用,当这些方面都得心应手的时候,可以尝试改造一些框架,或是自己创造一个. 曾经我以为Python世界里的框架已经够多了,后来发现相比golang简直小巫见大巫.golang提供的net/http库已经很好了,对于http的协议的实现非常好,基于此再造框架,也不会是难事,因此生态中出现了很多框架.既然构造框架的门槛变低了,