久久精品五月,日韩不卡视频在线观看,国产精品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综合
亚洲午夜久久| 欧美69视频| 亚洲精品精选| 午夜久久av| 国产精品一二| 国产精品草草| 久久香蕉精品香蕉| 天堂中文在线播放| 99久精品视频在线观看视频| 国产精品久久久久蜜臀| 91中文字幕精品永久在线| 日韩精品麻豆| 国产一区导航| 一区二区高清| 日韩欧美激情| 久久久久伊人| 欧美国产91| 蜜臀精品一区二区三区在线观看 | 日韩av在线中文字幕| 91一区二区| 国产精品社区| 麻豆精品在线播放| 亚洲一级少妇| 国产一区成人| 国产亚洲欧美日韩精品一区二区三区| 精品国产精品久久一区免费式| 尤物tv在线精品| 亚洲精品激情| 日本精品不卡| 久久不卡日韩美女| 91高清一区| 免费在线欧美黄色| 国产色综合网| 欧美在线黄色| 91精品电影| 韩国久久久久久| 91精品尤物| 黄色国产精品| 欧美黄色一区| 日韩中出av| 亚洲欧洲一区二区天堂久久| 麻豆久久一区| 欧美亚洲tv| 在线看片日韩| 国产亚洲永久域名| 免费av一区| 秋霞国产精品| 日本а中文在线天堂| 国产精品国码视频| 日本欧美大码aⅴ在线播放| 欧美在线影院| 蜜臀91精品国产高清在线观看| 国产中文欧美日韩在线| 综合激情五月婷婷| 99亚洲精品| 天堂成人免费av电影一区 | 亚洲精品黄色| 另类av一区二区| 好看的亚洲午夜视频在线| 欧美日韩精品免费观看视完整 | 国产精品国码视频| 国产免费av国片精品草莓男男| 亚洲一区二区三区四区五区午夜| 午夜日韩在线| 喷白浆一区二区| 婷婷亚洲五月| 亚洲一级大片| 日韩免费精品| 欧美视频二区| 麻豆成人91精品二区三区| 精品国产欧美日韩| 久久久久久美女精品| 性欧美长视频| 国产日韩欧美中文在线| 国内不卡的一区二区三区中文字幕| 首页国产精品| 国产在线不卡| 日韩视频精品在线观看| 日本国产亚洲| 国产传媒在线观看| 欧美日韩激情| 国产精品videossex| 性欧美xxxx免费岛国不卡电影| 蜜桃91丨九色丨蝌蚪91桃色| 日韩高清欧美激情| 亚洲成人av观看| 日韩不卡一二三区| 日韩欧美二区| 中文字幕日韩亚洲| 精品九九久久| 石原莉奈在线亚洲三区| 国产aⅴ精品一区二区三区久久| 欧美jjzz| 国产精品午夜av| 黄色精品网站| 麻豆国产精品777777在线| 性色一区二区| 日韩成人a**站| 日本亚洲欧洲无免费码在线| 日本精品影院| 国产精品igao视频网网址不卡日韩 | 中文字幕亚洲精品乱码| 精品视频在线观看网站| 久久香蕉国产| 久久av电影| 日韩欧美中文字幕一区二区三区| 午夜欧美巨大性欧美巨大| 国产精品白丝一区二区三区| 亚洲丝袜啪啪| 欧美日韩国产探花| 日韩a一区二区| 鲁大师精品99久久久| 欧美在线日韩| 日韩成人午夜精品| 久久亚洲色图| 免费一区二区视频| 午夜精品久久久久久久久久蜜桃| 鲁大师精品99久久久| 亚洲精品乱码久久久久久蜜桃麻豆 | 国产精品综合| 视频精品一区二区| 在线亚洲激情| 亚洲精品91| 亚洲高清激情| 91精品一区二区三区综合| 日本不良网站在线观看| 麻豆中文一区二区| 国产精品久一| 免费在线日韩av| 国产精品毛片一区二区在线看| 欧美激情福利| 国内一区二区三区| 黄色精品视频| 免费观看亚洲| 蜜臀av免费一区二区三区| 99香蕉国产精品偷在线观看 | 日韩国产成人精品| 天堂va在线高清一区| 国产精品综合| 国产中文字幕一区二区三区| 美日韩一区二区三区| 国产中文字幕一区二区三区| 日韩一区三区| 久久亚洲风情| 美女视频黄 久久| 中文字幕系列一区| 亚洲综合丁香| 欧美欧美黄在线二区| 丁香婷婷久久| 亚洲国产不卡| 久久精品凹凸全集| 香蕉视频亚洲一级| 蜜臀a∨国产成人精品| 欧美国产日本| 久久精品主播| 亚洲精品2区| 国产精品一区免费在线| 国产亚洲一区二区手机在线观看| 韩日一区二区三区| 国产视频一区二| 欧美黄色网页| 欧美日本久久| 欧美91福利在线观看| 国产欧美久久一区二区三区| 久久九九99| 国产精品1luya在线播放| 国产高清一区二区| 日韩欧美美女在线观看| 久久精品亚洲人成影院| 91精品一区国产高清在线gif| 日韩av午夜在线观看| 国产99久久| 国产精品亚洲综合在线观看| 日韩成人免费| 亚洲欧美日韩国产一区| 美女久久精品| 亚洲视频二区| 成人看片网站| 国产高清日韩| 国产欧美高清| 黄色免费成人| 国产精品亚洲一区二区在线观看| 欧美综合另类| 国产精品亚洲产品| 日韩亚洲国产欧美| 欧美日韩亚洲一区| 综合国产在线| 午夜在线精品| 午夜欧美在线| 国产精品成人a在线观看| 久久超碰99| 蜜桃久久精品一区二区| 精品成人免费一区二区在线播放| 日本激情一区| 欧美日韩免费观看视频| 国产精品av一区二区| 欧美亚洲精品在线| 国产精品毛片在线| 99国产精品久久久久久久 | 欧美一区影院|