GO 切片刪除元素的三種方法
Go語(yǔ)言并沒(méi)有對(duì)刪除切片元素提供專用的語(yǔ)法或者接口,需要使用切片本身的特性來(lái)刪除元素,根據(jù)要?jiǎng)h除元素的位置有三種情況,分別是從開(kāi)頭位置刪除、從中間位置刪除和從尾部刪除,其中刪除切片尾部的元素速度最快。
從開(kāi)頭位置刪除
刪除開(kāi)頭的元素可以直接移動(dòng)數(shù)據(jù)指針:
a = []int{1, 2, 3}
a = a[1:] // 刪除開(kāi)頭1個(gè)元素
a = a[N:] // 刪除開(kāi)頭N個(gè)元素也可以不移動(dòng)數(shù)據(jù)指針,但是將后面的數(shù)據(jù)向開(kāi)頭移動(dòng),可以用 append 原地完成(所謂原地完成是指在原有的切片數(shù)據(jù)對(duì)應(yīng)的內(nèi)存區(qū)間內(nèi)完成,不會(huì)導(dǎo)致內(nèi)存空間結(jié)構(gòu)的變化):
a = []int{1, 2, 3}
a = append(a[:0], a[1:]...) // 刪除開(kāi)頭1個(gè)元素
a = append(a[:0], a[N:]...) // 刪除開(kāi)頭N個(gè)元素還可以用 copy() 函數(shù)來(lái)刪除開(kāi)頭的元素:
a = []int{1, 2, 3}
a = a[:copy(a, a[1:])] // 刪除開(kāi)頭1個(gè)元素
a = a[:copy(a, a[N:])] // 刪除開(kāi)頭N個(gè)元素從中間位置刪除
對(duì)于刪除中間的元素,需要對(duì)剩余的元素進(jìn)行一次整體挪動(dòng),同樣可以用 append 或 copy 原地完成:
a = []int{1, 2, 3, ...}
a = append(a[:i], a[i+1:]...) // 刪除中間1個(gè)元素
a = append(a[:i], a[i+N:]...) // 刪除中間N個(gè)元素
a = a[:i+copy(a[i:], a[i+1:])] // 刪除中間1個(gè)元素
a = a[:i+copy(a[i:], a[i+N:])] // 刪除中間N個(gè)元素從尾部刪除
a = []int{1, 2, 3}
a = a[:len(a)-1] // 刪除尾部1個(gè)元素
a = a[:len(a)-N] // 刪除尾部N個(gè)元素刪除開(kāi)頭的元素和刪除尾部的元素都可以認(rèn)為是刪除中間元素操作的特殊情況,下面來(lái)看一個(gè)示例。
【示例】刪除切片指定位置的元素。
package main
import "fmt"
func main() {
seq := []string{"a", "b", "c", "d", "e"}
// 指定刪除位置
index := 2
// 查看刪除位置之前的元素和之后的元素
fmt.Println(seq[:index], seq[index+1:])
// 將刪除點(diǎn)前后的元素連接起來(lái)
seq = append(seq[:index], seq[index+1:]...)
fmt.Println(seq)
}代碼輸出結(jié)果:
[a b] [d e]
[a b d e]
代碼說(shuō)明如下:
- 第 1 行,聲明一個(gè)整型切片,保存含有從 a 到 e 的字符串。
- 第 4 行,為了演示和講解方便,使用 index 變量保存需要?jiǎng)h除的元素位置。
- 第 7 行,seq[:index] 表示的就是被刪除元素的前半部分,值為 [1 2],seq[index+1:] 表示的是被刪除元素的后半部分,值為 [4 5]。
- 第 10 行,使用 append() 函數(shù)將兩個(gè)切片連接起來(lái)。
- 第 12 行,輸出連接好的新切片,此時(shí),索引為 2 的元素已經(jīng)被刪除。
代碼的刪除過(guò)程可以使用下圖來(lái)描述。

圖:切片刪除元素的操作過(guò)程
Go語(yǔ)言中刪除切片元素的本質(zhì)是,以被刪除元素為分界點(diǎn),將前后兩個(gè)部分的內(nèi)存重新連接起來(lái)。
提示
連續(xù)容器的元素刪除無(wú)論在任何語(yǔ)言中,都要將刪除點(diǎn)前后的元素移動(dòng)到新的位置,隨著元素的增加,這個(gè)過(guò)程將會(huì)變得極為耗時(shí),因此,當(dāng)業(yè)務(wù)需要大量、頻繁地從一個(gè)切片中刪除元素時(shí),如果對(duì)性能要求較高的話,就需要考慮更換其他的容器了(如雙鏈表等能快速?gòu)膭h除點(diǎn)刪除元素)。
到此這篇關(guān)于GO 切片刪除元素的三種方法的文章就介紹到這了,更多相關(guān)GO 切片刪除元素內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Go實(shí)現(xiàn)一個(gè)百行聊天服務(wù)器的示例代碼
前段時(shí)間, redis作者整了個(gè)c語(yǔ)言版本的聊天服務(wù)器,代碼量攏共不過(guò)百行,于是, 心血來(lái)潮下, 我也整了個(gè)Go語(yǔ)言版本, 簡(jiǎn)單來(lái)說(shuō)就是實(shí)現(xiàn)了一個(gè)聊天室的功能,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
golang 生成二維碼海報(bào)的實(shí)現(xiàn)代碼
這篇文章主要介紹了golang 生成二維碼海報(bào)的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
Golang編程實(shí)現(xiàn)生成n個(gè)從a到b不重復(fù)隨機(jī)數(shù)的方法
這篇文章主要介紹了Golang編程實(shí)現(xiàn)生成n個(gè)從a到b不重復(fù)隨機(jī)數(shù)的方法,結(jié)合實(shí)例形式分析了Go語(yǔ)言字符串操作及隨機(jī)數(shù)生成的相關(guān)操作技巧,需要的朋友可以參考下2017-01-01
Go項(xiàng)目在GoLand中導(dǎo)入依賴標(biāo)紅問(wèn)題的解決方案
這篇文章主要介紹了Go項(xiàng)目在GoLand中導(dǎo)入依賴標(biāo)紅問(wèn)題的解決方案,文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-06-06
golang中struct和[]byte的相互轉(zhuǎn)換示例
這篇文章主要介紹了golang中struct和[]byte的相互轉(zhuǎn)換示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
詳解如何使用Go語(yǔ)言進(jìn)行文件監(jiān)控和通知
在Go語(yǔ)言中,文件監(jiān)控通常涉及到文件系統(tǒng)事件的監(jiān)聽(tīng),文件或目錄的狀態(tài)發(fā)生變化(如創(chuàng)建、刪除、修改等)時(shí),你的程序需要得到通知,所以本文給大家介紹了如何使用Go語(yǔ)言進(jìn)行文件監(jiān)控和通知,需要的朋友可以參考下2024-06-06
golang微服務(wù)框架基礎(chǔ)Gin基本路由使用詳解
這篇文章主要為大家介紹了golang微服務(wù)框架Gin基本路由的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11

