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链表线程安全

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,593评论 25 708
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,376评论 11 349
  • 好久没有动笔了。可能是很长时间自己都不敢去直面内心的困惑,也就更不敢将这种恐惧付诸于纸上了。 有人说的好,人们大多...
    simijoin阅读 231评论 0 0
  • 一年一度的高考季结束了,迎来了陆陆续续的毕业季。打开朋友圈,各种穿着学士服的花式毕业照映入眼帘,照片里能看到的是清...
    韩旭东阅读 915评论 9 17