使用 container/list

在这一小节中将通过 conList.go 中的 Go 代码来阐明如何使用 container/list 包,下面分为三个部分介绍。

container/list 包实现了链表

conList.go 的第一部分包含如下的 Go 代码:

package main

import (
    "container/list"
    "fmt"
    "strconv"
)

func printList(l *list.List) {
    for t := l.Back(); t != nil; t = t.Prev() {
        fmt.Print(t.Value, " ")
    }
    fmt.Println()

    for t := l.Front(); t != nil; t = t.Next() {
        fmt.Print(t.Value, " ")
    }

    fmt.Println()
}

这里有个函数叫 printList(),你可以传入一个 list.List 变量作为指针,然后输出其中所有的内容。这段 Go 代码展示了如何以从头到尾和从尾到头的两个方向输出 list.List 中的所有元素。通常,在你的程序中只需要使用其中的一种方式。你可以用Prev()Next() 函数来反向或正向迭代链表中的元素。

conList.go 中的第二个代码段如下:

func main() {

    values := list.New()

    e1 := values.PushBack("One")
    e2 := values.PushBack("Two")
    values.PushFront("Three")
    values.InsertBefore("Four", e1)
    values.InsertAfter("Five", e2)
    values.Remove(e2)
    values.Remove(e2)
    values.InsertAfter("FiveFive", e2)
    values.PushBackList(values)

    printList(values)

    values.Init()

你可以用 list.PushBack() 函数在链表尾部插入对象,也可以使用 list.PushFront() 函数在链表的头部插入对象。这两个函数的返回值都是链表中新插入的对象。如果你想在指定的元素后面插入新的元素,那么可以使用 list.InsertAfter() 函数。类似的,你应该使用 list.InsertBefore() 在指定元素的前面插入新元素,如果指定的元素不存在链表就不会改变。list.PushBackList() 将一个链表的副本插入到另一个链表的后面。list.PushFrontList() 函数将一个链表的副本插入到另一个链表的前面。list.Remove() 函数从链表中删除一个指定的元素。

注意,使用 values.Init() 将会清空一个现有的链表或者初始化一个新的链表。

conList.go 的最后一部分代码如下:

    fmt.Printf("After Init(): %v\n", values)

    for i := 0; i < 20; i++ {
        values.PushFront(strconv.Itoa(i))
    }

    printList(values)
}

这里使用 for 循环创建了一个新的链表,strconv.Itoa() 函数将整数值转化为一个字符串。

总之,container/list 包中函数的用法很好理解,结果也不出意外。

执行 conList.go 将会生成如下的输出:

$ go run conList.go
Five One Four Three Five One Four Three 
Three Four One Five Three Four One Five 
After Init(): &{{0xc420074180 0xc420074180 <nil> <nil>} 0}
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 
19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 
最后编辑: kuteng  文档更新时间: 2021-03-27 20:14   作者:kuteng