久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

go語言中list怎么刪除元素

在go語言中,可以使用remove()函數來刪除list元素,語法“list對象.Remove(element)”,參數element表示要刪除列表元素。element元素不能為空,如果不為空則返回被刪除的元素的值,如果為空則會報異常。

go語言中list怎么刪除元素

本教程操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

go提供了一個list包,類似python的list,可以存儲任意類型的數據,并提供了相應的API,如下:

type Element     func (e *Element) Next() *Element     func (e *Element) Prev() *Element type List     func New() *List     func (l *List) Back() *Element     func (l *List) Front() *Element     func (l *List) Init() *List     func (l *List) InsertAfter(v interface{}, mark *Element) *Element     func (l *List) InsertBefore(v interface{}, mark *Element) *Element     func (l *List) Len() int     func (l *List) MoveAfter(e, mark *Element)     func (l *List) MoveBefore(e, mark *Element)     func (l *List) MoveToBack(e *Element)     func (l *List) MoveToFront(e *Element)     func (l *List) PushBack(v interface{}) *Element     func (l *List) PushBackList(other *List)     func (l *List) PushFront(v interface{}) *Element     func (l *List) PushFrontList(other *List)     func (l *List) Remove(e *Element) interface{}
登錄后復制

其中,remove()函數用于列表list刪除元素,刪除的元素不能為空,如果為空,會報異常。

Remove(e *Element) interface{}
登錄后復制

參數 描述
e 要刪除列表元素。

返回值

  • 返回被刪除的元素的值。

列表刪除元素的示例

示例1:

package main import ( 	"container/list" 	"fmt" ) func main() { 	//使用 Remove 在列表中刪除元素 	listHaiCoder := list.New() 	listHaiCoder.PushFront("Hello") 	listHaiCoder.PushFront("HaiCoder") 	element := listHaiCoder.PushFront("Hello") 	removeEle := listHaiCoder.Remove(element) 	fmt.Println("RemoveElement =", removeEle) 	for i := listHaiCoder.Front(); i != nil; i = i.Next() { 		fmt.Println("Element =", i.Value) 	} }
登錄后復制

go語言中list怎么刪除元素

分析:

  • 我們通過 list.New 創建了一個列表 listHaiCoder,接著使用 PushFront 函數在列表中插入三個元素,接著使用 Remove 函數刪除了最后插入的元素。

  • 最后,我們打印被刪除的元素和刪除后的列表,Remove 函數返回的是被刪除的元素的值,同時,我們發現最后插入的元素已經被成功從列表刪除了。

示例2:刪除空元素

package main import ( 	"container/list" 	"fmt" ) func main() { 	//使用 Remove 在列表中刪除空元素,報錯 	listHaiCoder := list.New() 	listHaiCoder.PushFront("Hello") 	listHaiCoder.PushFront("HaiCoder") 	listHaiCoder.Remove(nil) }
登錄后復制

程序運行后,控制臺輸出如下:

go語言中list怎么刪除元素

擴展知識:list刪除所有元素

借助list包提供的API,list用起來確實挺方便,但是在使用過程中,如果不注意就會遇到一些難以發現的坑,導致程序結果不是預想的那樣。這里要說的坑是通過for循環遍歷list,并刪除所有元素時會遇到的問題。例如,下面這個示例程序創建了一個list,并依次將0-3存入,然后通過for循環遍歷list刪除所有元素:

package main import (     "container/list"     "fmt" ) func main() {     l := list.New()     l.PushBack(0)     l.PushBack(1)     l.PushBack(2)     l.PushBack(3)     fmt.Println("original list:")     prtList(l)     fmt.Println("deleted list:")     for e := l.Front(); e != nil; e = e.Next() {         l.Remove(e)     }     prtList(l) } func prtList(l *list.List) {     for e := l.Front(); e != nil; e = e.Next() {         fmt.Printf("%v ", e.Value)     }     fmt.Printf("n") }
登錄后復制

運行程序輸出如下:

original list: 0 1 2 3 deleted list: 1 2 3
登錄后復制

從輸出可以知道,list中的元素并沒有被完全刪除,僅刪除了第一個元素0,和最初設想不一樣,按照go的使用習慣,遍歷一個list并刪除所有元素寫法應該如下:

for e := l.Front(); e != nil; e = e.Next() {     l.Remove(e) }
登錄后復制

但是根據上面示例代碼的輸出,這樣刪除list所有元素是無效的,那么問題出在哪呢?由for循環的機制可以知道,既然刪除了第一個元素,沒有刪除第二個元素,肯定是第二次循環的條件無效,才導致循環退出,即執行完下面語句后:

l.Remove(e)
登錄后復制

e應該為nil,所以循環退出。在for循環中的l.Remove(e)語句前添加打印語句驗證,例如添加如下語句:

fmt.Println("delete a element from list")
登錄后復制

運行程序輸出如下:

original list: 0 1 2 3 deleted list: delete a element from list 1 2 3
登錄后復制

可以看到,確實只循環了一次,循環就結束了。即當執行完語句l.Remove(e)后,e等于e.Next(),因為e.Next()為nil,導致e為nil,循環退出。為什么e.Next()會是nil呢?通過查看go list源碼,如下所示:

// remove removes e from its list, decrements l.len, and returns e. func (l *List) remove(e *Element) *Element {     e.prev.next = e.next     e.next.prev = e.prev     e.next = nil // avoid memory leaks     e.prev = nil // avoid memory leaks     e.list = nil     l.len--     return e } // Remove removes e from l if e is an element of list l. // It returns the element value e.Value. func (l *List) Remove(e *Element) interface{} {     if e.list == l {         // if e.list == l, l must have been initialized when e was inserted         // in l or l == nil (e is a zero Element) and l.remove will crash         l.remove(e)     }     return e.Value }
登錄后復制

由源碼中可以看到,當執行l.Remove(e)時,會在內部調用l.remove(e)方法刪除元素e,為了避免內存泄漏,會將e.next和e.prev賦值為nil,這就是問題根源。

修正程序如下:

package main import (     "container/list"     "fmt" ) func main() {     l := list.New()     l.PushBack(0)     l.PushBack(1)     l.PushBack(2)     l.PushBack(3)     fmt.Println("original list:")     prtList(l)     fmt.Println("deleted list:")     var next *list.Element     for e := l.Front(); e != nil; e = next {         next = e.Next()         l.Remove(e)     }     prtList(l) } func prtList(l *list.List) {     for e := l.Front(); e != nil; e = e.Next() {         fmt.Printf("%v ", e.Value)     }     fmt.Printf("n") }
登錄后復制

運行程序輸出如下:

original list: 0 1 2 3 deleted list:
登錄后復制

可以看見,list中的所有元素已經被正確刪除。

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
激情欧美一区| 蜜桃一区二区三区在线| 六月丁香综合| 日韩在线一区二区| 最新亚洲一区| 免费人成在线不卡| 亚洲免费专区| 久久不见久久见中文字幕免费| 国产亚洲久久| 久久爱www成人| 中文字幕高清在线播放| 亚洲啊v在线| 日韩电影免费网站| 激情久久中文字幕| 香蕉成人久久| 国产日产精品_国产精品毛片 | 9久re热视频在线精品| 亚洲一区免费| 日韩精品一级| 国产91在线播放精品| 久久久国产精品一区二区中文| 成人av动漫在线观看| 丝袜国产日韩另类美女| 91精品国产经典在线观看| 精品视频免费| 亚洲色图综合| 日本欧美国产| 日韩精品一级| 日韩毛片视频| 日韩黄色在线观看| 日韩欧美网址| 欧美欧美黄在线二区| 久久精品青草| 国产亚洲一区二区三区不卡| 久久精品99久久无色码中文字幕| 婷婷亚洲成人| 日本在线啊啊| 日韩视频一二区| 香蕉久久精品| 国产精品激情| 中文字幕日韩高清在线| 日韩中文影院| 国产精品国码视频| 中文字幕av一区二区三区人| 国产高清不卡| 美日韩一区二区三区| 午夜久久av| 午夜在线视频观看日韩17c| 久久国产主播| 成人一区不卡| 美腿丝袜在线亚洲一区| 水野朝阳av一区二区三区| 97精品在线| 精品日韩在线| 国产精品亚洲综合在线观看| 免费成人性网站| 99riav国产精品| 欧美亚洲国产激情| 电影亚洲精品噜噜在线观看| 久久中文在线| 国产成人精品一区二区三区在线| 日韩三级一区| 国产毛片一区二区三区| 日韩国产一区二| 日本99精品| 奇米亚洲欧美| 欧美1区二区| 国产欧美在线| 免费一级欧美片在线观看网站| 久久一区欧美| 天堂av在线| 欧美日韩免费观看一区=区三区| 欧美日韩精品免费观看视频完整| 国产精品毛片| 亚洲欧美专区| 国产精品欧美日韩一区| 精品一区二区三区中文字幕| 精品精品久久| 九一国产精品| 日韩国产在线不卡视频| 国语精品一区| 在线视频亚洲| 亚洲精品福利| 国产va免费精品观看精品视频| 色爱av综合网| 日韩一区二区三区四区五区| 免费亚洲一区| 夜久久久久久| 国精品产品一区| 水蜜桃久久夜色精品一区的特点 | 蜜臀久久99精品久久一区二区| 免费在线成人网| 精品少妇av| 丝袜亚洲另类欧美| 国产激情精品一区二区三区| 日韩欧美不卡| 国产福利资源一区| 日韩亚洲在线| 欧美亚洲日本精品| 欧美午夜网站| 久久成人一区| 伊人精品一区| 精品国产午夜肉伦伦影院| 国产精品普通话对白| 国产一区二区亚洲| 欧美另类中文字幕 | 女生影院久久| 国产精品亚洲成在人线| 亚洲一区中文| 99久久精品网站| 国内精品伊人| 国产欧美日韩影院| 亚洲影视一区二区三区| 99视频精品全国免费| 久久午夜影院| 国产精品片aa在线观看| 日韩和欧美一区二区三区| 日本免费一区二区三区四区| 精品国产一级| 精品国产午夜肉伦伦影院| 亚洲精品在线国产| 蜜桃视频第一区免费观看| 久久高清免费| 日韩精品久久久久久久电影99爱| 精品久久影院| 欧美精品1区| 久久亚洲精品中文字幕| 国产精品羞羞答答在线观看| 日韩成人一级| 国产精品一级在线观看| 国产精品亚洲综合色区韩国| 久久在线91| 成人影视亚洲图片在线| 九九色在线视频| 欧美影院三区| 欧美一区久久久| 黄在线观看免费网站ktv| 中文字幕成在线观看| 久久网站免费观看| 美女精品一区| 国产日韩三级| 成人在线视频免费看| 欧美一区二区三区高清视频| 久久亚洲精品伦理| 日本va欧美va精品发布| 国产aⅴ精品一区二区四区| 亚洲国产日韩欧美在线| 亚洲日本欧美| 激情综合婷婷| 亚洲欧美日本日韩| 亚洲精品黄色| 国产 日韩 欧美一区| 亚洲另类av| 97精品国产福利一区二区三区| 国产精品97| 国产黄色一区| 免费日韩视频| 国产一区2区在线观看| 免费精品视频| 蜜桃视频在线网站| 日韩精品第一| 91精品一区国产高清在线gif| 亚洲精品护士| 欧美69视频| 丰满少妇一区| 视频一区在线视频| 鲁鲁在线中文| 国产剧情一区| 日韩精品一级二级| 日韩不卡在线| 久久一区视频| 91伊人久久| 亚洲欧美日韩国产一区| 四虎4545www国产精品| 欧美aⅴ一区二区三区视频| 亚洲精品在线国产| 99精品一区| 蜜臀国产一区| 国产网站在线| 久久中文字幕一区二区| 亚州精品视频| 亚洲一区二区小说| 国产精品腿扒开做爽爽爽挤奶网站| 在线天堂中文资源最新版| 国产精品久久| 久久黄色影视| 91精品在线免费视频| 日韩专区欧美专区| 午夜日韩av| 亚洲一区欧美激情| 国产精品毛片在线| 日韩中文字幕一区二区三区| 亚洲综合不卡| 亚洲精品系列| 久久精品99国产精品日本| 久久国产精品99国产| 中文亚洲免费| 免费在线观看不卡| 日韩视频1区| 麻豆国产欧美日韩综合精品二区|