前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >008-golang-container/list 链表的简单使用

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

作者头像
上善若水.夏
发布2018-09-28 11:26:51
1.7K0
发布2018-09-28 11:26:51
举报
文章被收录于专栏:上善若水上善若水

一.前言

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

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

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

二.golang中的链表

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

1. container/list API接口

代码语言:javascript
复制
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.简单实例

代码语言:javascript
复制
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链表线程安全

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.12.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.前言
  • 二.golang中的链表
    • 1. container/list API接口
      • 2.简单实例
      • 参考链接
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档