008-golang-container/list 链表的简单使用

一.前言

需要对一个文件进行编辑,主要的操作有

  1. 修改某行的内容
  2. 插入一行获多行
  3. 删除某行

文件不是特别大的文件,所以可以加载到内存中直接处理。感觉最好的数据结构还是链表

二.golang中的链表

  1. container/list 是golang中内置的链表库
  2. 和大多数语言中内置的链表库一样,container/list 不是线程安全的。

1. container/list API接口

func (e *Element) Next() *Element  //返回该元素的下一个元素,如果没有下一个元素则返回nil
func (e *Element) Prev() *Element//返回该元素的前一个元素,如果没有前一个元素则返回nil。
func New() *List //返回一个初始化的list
func (l *List) Back() *Element //获取list l的最后一个元素
func (l *List) Front() *Element //获取list l的第一个元素
func (l *List) Init() *List  //list l初始化或者清除list l
func (l *List) InsertAfter(v interface{}, mark *Element) *Element  //在list l中元素mark之后插入一个值为v的元素,并返回该元素,如果mark不是list中元素,则list不改变。
func (l *List) InsertBefore(v interface{}, mark *Element) *Element//在list l中元素mark之前插入一个值为v的元素,并返回该元素,如果mark不是list中元素,则list不改变。
func (l *List) Len() int //获取list l的长度
func (l *List) MoveAfter(e, mark *Element)  //将元素e移动到元素mark之后,如果元素e或者mark不属于list l,或者e==mark,则list l不改变。
func (l *List) MoveBefore(e, mark *Element)//将元素e移动到元素mark之前,如果元素e或者mark不属于list l,或者e==mark,则list l不改变。
func (l *List) MoveToBack(e *Element)//将元素e移动到list l的末尾,如果e不属于list l,则list不改变。
func (l *List) MoveToFront(e *Element)//将元素e移动到list l的首部,如果e不属于list l,则list不改变。
func (l *List) PushBack(v interface{}) *Element//在list l的末尾插入值为v的元素,并返回该元素。
func (l *List) PushBackList(other *List)//在list l的尾部插入另外一个list,其中l和other可以相等。
func (l *List) PushFront(v interface{}) *Element//在list l的首部插入值为v的元素,并返回该元素。
func (l *List) PushFrontList(other *List)//在list l的首部插入另外一个list,其中l和other可以相等。
func (l *List) Remove(e *Element) interface{}//如果元素e属于list l,将其从list中删除,并返回元素e的值。

2.简单实例

import (
    "fmt"
    "os"
    "bufio"
    "io"
    "container/list"
)



type FileEditer  struct {
    Lines  *list.List
    Index    int32
}


/**
 *将文件加载到内存中
 */
func (p * FileEditer) load(input string) {
    f, err := os.Open(input)
    if err != nil {
        panic(err)
    }
    defer f.Close()

    rd := bufio.NewReader(f)
    for {
        line, err := rd.ReadString('\n') //以'\n'为结束符读入一行
        
        if err != nil || io.EOF == err {
            break
        }
        p.Lines.PushBack(line)
    }  
    
}

func (p * FileEditer) dump(input string) {

    for v:= p.Lines.Front();v!=nil; v= v.Next() {
        line := v.Value.(string)
        fmt.Printf("%+v",line)
    }

    bufio.NewReadWriter
}



func NewFileEditer() (*FileEditer) {
    p := new(FileEditer)

    p.Index =0
    p.Lines =  list.New()
    return  p
}

参考链接

  1. golang使用sync保证container/list链表线程安全

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏chenjx85的技术专栏

leetcode-438-Find All Anagrams in a String

283100
来自专栏十月梦想

类的传参以及super属性和super对象

在上述例子我们也看到了指定的子类特有的方法直接指定,那么我们如何指定子类特有的属性呢?我们这里用到了super方法;

14520
来自专栏python百例

06-字符串使用基础

12920
来自专栏无所事事者爱嘲笑

关于setTimeout和setInterval的函数参数问题

17620
来自专栏Golang语言社区

【JS游戏编程基础】关于js里的this关键字的理解

this关键字在c++,java中都提供了这个关键字,在刚开始学习时觉得有难度,但是只要理解了,用起来就方便多了,下面通过本篇文章给大家详解js里this关键字...

493100
来自专栏liulun

Nim教程【七】

这是国内第一个关于Nim的系列教程 先说废话 很开心,在今天凌晨快一点多的时候拿到了 nim-lang.com;nim-lang.cn;nim-lang.net...

25850
来自专栏领域驱动设计DDD实战进阶

06-TypeScript中的表达式

TypeScript中提供了箭头表达式,通过箭头表达式可以简化我们的编码。 1.箭头表达式简化匿名函数 在JS中,我们通常使用匿名函数,匿名函数实际上是赋值给一...

30370
来自专栏微信公众号:Java团长

经典排序算法总结--冒泡、快排、插入、希尔、归并、选择

对纵向排列的关键字序列,按照自下而上的扫描方向对两两相邻的关键字进行比较, 若为逆序(k_j < k_j-1 ),则将两个记录交换位置; 重复上述扫描排序过...

11520
来自专栏Golang语言社区

go语言基本类型

这篇文章主要介绍了GO语言基本类型,较为详细的分析了整形、浮点型、字符串、指针等类型的具体用法,是深入学习GO语言所必须掌握的重要基础,需要的朋友可以参考下 ...

33360
来自专栏Pythonista

Go 语言常量

在每一个const关键字出现时,被重置为0,然后再下一个const出现之前,每出现一次iota,其所代表的数字会自动增加1。

7910

扫码关注云+社区

领取腾讯云代金券