老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

go語言中list如何刪除元素

這篇文章主要介紹“go語言中list如何刪除元素”,在日常操作中,相信很多人在go語言中list如何刪除元素問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”go語言中list如何刪除元素”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

公司主營業務:網站設計制作、成都網站建設、移動網站開發等業務。幫助企業客戶真正實現互聯網宣傳,提高企業的競爭能力。創新互聯建站是一支青春激揚、勤奮敬業、活力青春激揚、勤奮敬業、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰,讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創新互聯建站推出萬寧免費做網站回饋大家。

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

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中的所有元素已經被正確刪除。

到此,關于“go語言中list如何刪除元素”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注創新互聯網站,小編會繼續努力為大家帶來更多實用的文章!


網頁標題:go語言中list如何刪除元素
分享路徑:http://www.xueling.net.cn/article/gggcpi.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 亚洲免费在线播放视频 | 久久网址 | 色屁屁WWW影院免费观看 | 亚洲综合日韩精品欧美国产 | 精品国产一区二区三区蜜殿 | 国产区在线看 | 麻豆久久久久久 | 美女视频黄是免费 | 亚洲国产国产亚洲一二三 | 欧美日韩国产高清一区二区三区 | 久久激情日本aⅴ | 亚洲看看| 亚洲综合一区二区三区四区 | 黑人巨大精品欧美在线观看 | 总裁与秘书高h肉 | 全球AV集中精品导航福利 | 日本一区视频在线 | 国产午夜草莓视频在线观看 | 英语老师解开裙子坐我腿中间 | 好男人中文资源在线观看 | 伊人久久综合无码中文字幕 | 麻豆AV无码精品一区二区 | japanese在线观看精品视频 | 伊人操操 | 在线观看黄色免费 | 操操影院 | 天堂在线www资源在线 | 久久99精品久久久久久久清纯 | 国产口爆吞精免费视频 | 99精品在线| 天天天天噜在线视频 | 在阳台上玩弄人妻的乳球 | 亚洲精品视频在线观看视频 | 中文字幕亚洲无线 | 精品一区二区三区波多野结衣 | 免费se99se | 日本久草视频 | 免费日p视频 | 国产成人亚洲欧美久久影院 | 黄色网址手机在线观看 | 丰满少妇被猛烈进出69影院 |