中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang切片刪除指定元素的方法有哪些

發布時間:2022-07-02 13:54:51 來源:億速云 閱讀:124 作者:iii 欄目:開發技術

這篇文章主要介紹了Golang切片刪除指定元素的方法有哪些的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Golang切片刪除指定元素的方法有哪些文章都會有所收獲,下面我們一起來看看吧。

    前言

    Go 并沒有提供刪除切片元素專用的語法或函數,需要使用切片本身的特性來刪除元素。

    刪除切片指定元素一般有如下幾種方法,本文以 []int 為例給出具體實現。

    1.截取法(修改原切片)

    這里利用對 slice 的截取刪除指定元素。注意刪除時,后面的元素會前移,所以下標 i 應該左移一位。

    // DeleteSlice1 刪除指定元素。
    func DeleteSlice1(a []int, elem int) []int {
    	for i := 0; i < len(a); i++ {
    		if a[i] == elem {
    			a = append(a[:i], a[i+1:]...)
    			i--
    		}
    	}
    	return a
    }

    2.拷貝法(不改原切片)

    這種方法最容易理解,重新使用一個 slice,將要刪除的元素過濾掉。缺點是需要開辟另一個 slice 的空間,優點是容易理解,而且不會修改原 slice。

    // DeleteSlice2 刪除指定元素。
    func DeleteSlice2(a []int, elem int) []int {
    	tmp := make([]int, 0, len(a))
    	for _, v := range a {
    		if v != elem {
    			tmp = append(tmp, v)
    		}
    	}
    	return tmp
    }

    3.移位法(修改原切片)

    3.1 方式一

    利用一個下標 index,記錄下一個有效元素應該在的位置。遍歷所有元素,當遇到有效元素,將其移動到 index 且 index 加一。最終 index 的位置就是所有有效元素的下一個位置,最后做一個截取就行了。這種方法會修改原來的 slice。

    該方法可以看成對第一種方法截取法的改進,因為每次指需移動一個元素,性能更加。

    // DeleteSlice3 刪除指定元素。
    func DeleteSlice3(a []int, elem int) []int {
    	j := 0
    	for _, v := range a {
    		if v != elem {
    			a[j] = v
    			j++
    		}
    	}
    	return a[:j]
    }

    3.2 方式二

    創建了一個 slice,但是共用原始 slice 的底層數組。這樣也不需要額外分配內存空間,直接在原 slice 上進行修改。

    // DeleteSlice4 刪除指定元素。
    func DeleteSlice4(a []int, elem int) []int {
    	tgt := a[:0]
    	for _, v := range a {
    		if v != elem {
    			tgt = append(tgt, v)
    		}
    	}
    	return tgt
    }

    4.性能對比

    假設我們的切片有 0 和 1,我們要刪除所有的 0。

    這里分別對長度為 10、100、1000 的切片進行測試,來上下上面四種實現的性能差異。

    生成切片函數如下:

    func getSlice(n int) []int {
    	a := make([]int, 0, n)
    	for i := 0; i < n; i++ {
    		if i%2 == 0 {
    			a = append(a, 0)
    			continue
    		}
    		a = append(a, 1)
    	}
    	return a
    }

    基準測試代碼如下:

    func BenchmarkDeleteSlice1(b *testing.B) {
    	for i := 0; i < b.N; i++ {
    		_ = DeleteSlice1(getSlice(10), 0)
    	}
    }
    func BenchmarkDeleteSlice2(b *testing.B) {
    	for i := 0; i < b.N; i++ {
    		_ = DeleteSlice2(getSlice(10), 0)
    	}
    }
    func BenchmarkDeleteSlice3(b *testing.B) {
    	for i := 0; i < b.N; i++ {
    		_ = DeleteSlice3(getSlice(10), 0)
    	}
    }
    func BenchmarkDeleteSlice4(b *testing.B) {
    	for i := 0; i < b.N; i++ {
    		_ = DeleteSlice4(getSlice(10), 0)
    	}
    }

    測試結果如下:

    原切片長度為 10:

    go test -bench=. main/slice
    goos: windows
    goarch: amd64
    pkg: main/slice
    cpu: Intel(R) Core(TM) i7-9700 CPU @ 3.00GHz
    BenchmarkDeleteSlice1-8         17466486                65.07 ns/op
    BenchmarkDeleteSlice2-8         14897282                85.22 ns/op
    BenchmarkDeleteSlice3-8         21952129                50.78 ns/op
    BenchmarkDeleteSlice4-8         22176390                54.68 ns/op
    PASS
    ok      main/slice      5.427s

    原切片長度為 100:

    BenchmarkDeleteSlice1-8          1652146               762.1 ns/op
    BenchmarkDeleteSlice2-8          2124237               578.4 ns/op
    BenchmarkDeleteSlice3-8          3161318               359.9 ns/op
    BenchmarkDeleteSlice4-8          2714158               423.7 ns/op

    原切片長度為 1000:

    BenchmarkDeleteSlice1-8            56067             21915 ns/op
    BenchmarkDeleteSlice2-8           258662              5007 ns/op
    BenchmarkDeleteSlice3-8           432049              2724 ns/op
    BenchmarkDeleteSlice4-8           325194              3615 ns/op

    關于“Golang切片刪除指定元素的方法有哪些”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Golang切片刪除指定元素的方法有哪些”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    莱阳市| 清水县| 图们市| 松江区| 县级市| 噶尔县| 泰和县| 海城市| 深泽县| 色达县| 白城市| 夏河县| 桐庐县| 神木县| 灯塔市| 荆门市| 岚皋县| 岢岚县| 承德市| 巫山县| 大洼县| 长白| 青浦区| 新泰市| 勐海县| 克拉玛依市| 普洱| 乐东| 彭山县| 福泉市| 宁海县| 平罗县| 华坪县| 安图县| 汉阴县| 钟祥市| 宣武区| 潼南县| 隆尧县| 山西省| 定安县|