• Go语言 list列表


    在Go语言中,列表使用 container/list 包来实现,内部的实现原理是双链表,列表能够高效地进行任意位置的元素插入和删除操作。

    初始化列表

    list 的初始化有两种方法:分别是使用 New() 函数和 var 关键字声明,两种方法的初始化效果都是一致的。

    1) 通过 container/list 包的 New() 函数初始化 list

    变量名 := list.New()

    2) 通过 var 关键字声明初始化 list

    var 变量名 list.List

    列表与切片和 map 不同的是,列表并没有具体元素类型的限制,因此,列表的元素可以是任意类型,这既带来了便利,也引来一些问题,例如给列表中放入了一个 interface{} 类型的值,取出值后,如果要将 interface{} 转换为其他类型将会发生宕机。

    在列表中插入元素

    双链表支持从队列前方或后方插入元素,分别对应的方法是 PushFront 和 PushBack。

    提示

    这两个方法都会返回一个 *list.Element 结构,如果在以后的使用中需要删除插入的元素,则只能通过 *list.Element 配合 Remove() 方法进行删除,这种方法可以让删除更加效率化,同时也是双链表特性之一。

    从列表中删除元素

    列表插入函数的返回值会提供一个 *list.Element 结构,这个结构记录着列表元素的值以及与其他节点之间的关系等信息,从列表中删除元素时,需要用到这个结构进行快速删除。

    package main
    
    import (
        "container/list"
        "fmt"
    )
    
    func main() {
        //创建一个实例
        lst := list.New()
        //尾部添加
        lst.PushBack(".")
        //前部添加
        lst.PushFront("day")
        //前部添加后,保存元素句柄
        element := lst.PushFront("is ")
        //在is 之后添加 mon
        lst.InsertAfter("mon", element)
        //在is 之前添加 Today
        lst.InsertBefore("Today ", element)
        //打印 輸出 Today is monday.
        // i:=lst.Front() 表示初始赋值,只会在一开始执行一次,每次循环会进行一次 i != nil 语句判断,如果返回 false,表示退出循环,反之则会执行 i = i.Next()。
        for i := lst.Front(); i != nil; i = i.Next() {
    
            fmt.Print(i.Value)
        }
        //删除 元素
        lst.Remove(element)
        fmt.Println()
        //打印 輸出 Today   monday.
        for i := lst.Front(); i != nil; i = i.Next() {
    
            fmt.Print(i.Value)
        }
        fmt.Println("
    lst2输出")
        var lst2 list.List
        lst2.PushBack("one")
        lst2.PushFront("zero ")
        //打印
        for i := lst2.Front(); i != nil; i = i.Next() {
    
            fmt.Println(i.Value)
        }
    }

    打印输出

    Today is monday.
    Today monday.
    lst2输出
    zero
    one
  • 相关阅读:
    VA对于开发QT是神器,VA自动补全QT
    64位下好神奇啊(增加了PatchGuard技术保护自己,SSDT是相对地址,参数通过寄存器与rdi来传递)
    贵在坚持
    VC程序查错之内存访问异常
    QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
    QTimer源码分析(以Windows下实现为例)
    Go语言的优点(oschina讨论)
    致诸位新程序员:来自Chuck Jazdzewski慈父般的忠告
    poj1483 It's not a Bug, It's a Feature!
    App应用与思考
  • 原文地址:https://www.cnblogs.com/personblog/p/12257748.html
Copyright © 2020-2023  润新知