← 返回首页
Go基础教程(十三)
发表时间:2022-12-04 10:23:39
List

列表 (list) 是一种非连续存储的容器,又多个节点组成,节点通过一些变量将彼此串联起来。列表(list)底层常见的数据结构有: 单链表、双链表等。

在Go语言中,列表的实现都在 container/list 包中,内部实现原理是双链表。列表(list)能够方便高效地进行元素的删除、插入操作。

1.初始化list

通过 container/list 包中的 New 方法来初始化 list。

实例:

package main

import (
    "container/list"
    "fmt"
)

func main() {
    l := list.New()

        //在头部添加新元素
    l.PushFront("北京")
    l.PushFront("上海")
    l.PushFront("广州")
    l.PushFront("深圳")

    fmt.Println(l)

    // 遍历
    for i := l.Front(); i != nil; i = i.Next() {
        fmt.Println(i.Value)
    }
}

运行结果:

&{{0xc000100570 0xc0001004e0 <nil> <nil>} 4}
深圳 
广州 
上海 
北京 

相比较 map (字典),列表没有具体元素类型的限制,也就是说,你可以添加任意类型到 list 容器中,如字符串 、整型等。这带来了一些便利,但是也存在一些问题:给一个列表添加了非期望类型的值后,在遍历取值时,将 interface{} 转换为期望类型时会发生死机。

2.List的常用API

函数 说明
PushFront 在列表头部添加新元素
PushBack 在列表头部添加新元素
PushFrontList(other *List) 添加 other 列表中的元素到头部
PushBackList(other *List) 添加 other 列表中的元素到尾部
InsertAfter(v interface{}, mark Element) Element 在 mark 点后面插入元素
InsertBefore(v interface{}, mark Element) Element 在 mark 点前面插入元素

实例:

package main

import (
    "container/list"
    "fmt"
)

func main() {
    l := list.New()

    l.PushBack("北京")
    l.PushBack("上海")
    l.PushBack("广州")
    l.PushBack("深圳")

    fmt.Println(l)

    // 遍历
    for i := l.Front(); i != nil; i = i.Next() {
        fmt.Println(i.Value)
    }
}

运行结果:

&{{0xc0001004e0 0xc000100570 <nil> <nil>} 4}
北京 
上海 
广州 
深圳 

List增删改查完整案例:


package main

import (
    "container/list"
    "fmt"
)

func main() {
    l1 := list.New()
    l2 := list.New()

    l2.PushFront("成都")
    l2.PushFront("西安")

    l1.PushBack("北京")
    l1.PushBack("上海")
    l1.PushBack("广州")
    l1.PushBack("深圳")

    //把列表2所有元素添加到l1头部
    l1.PushFrontList(l2)

    // 遍历
    for i := l1.Front(); i != nil; i = i.Next() {
        fmt.Println(i.Value)
    }

    var element *list.Element
    for i := l1.Front(); i != nil; i = i.Next() {
        if i.Value == "上海" {
            element = i
            break
        }
    }

    l1.InsertBefore("武汉", element)

    println("---------在上海前追加'武汉'-----------")
    // 遍历
    for i := l1.Front(); i != nil; i = i.Next() {
        fmt.Println(i.Value)
    }

    //删除广州

    println("---------删除'广州'-----------")

    for i := l1.Front(); i != nil; i = i.Next() {
        if i.Value == "广州" {
            element = i
            break
        }
    }

    l1.Remove(element)

    // 遍历
    for i := l1.Front(); i != nil; i = i.Next() {
        fmt.Println(i.Value)
    }

}

运行结果:

西安
成都                                   
北京                                   
上海                                   
广州                                   
深圳                                   
---------在上海前追加'武汉'----------- 
西安                                   
成都                                   
北京                                   
武汉                                   
上海                                   
广州                                   
深圳                                   
---------删除'广州'-----------         
西安                                   
成都                                   
北京                                   
武汉                                   
上海                                   
深圳