如何從 Go 中的切片 Slice 中刪除元素

Suraj Joshi 2023年1月30日
  1. 從給定切片建立子切片
  2. 在 Go 中從切片中刪除元素
如何從 Go 中的切片 Slice 中刪除元素

在 Go 中,切片是一個可變大小的陣列,具有從陣列開始的索引,但是其大小不是固定的,因為可以調整大小。切片中的任何元素都可以由於其動態性質而從切片中刪除。從切片中刪除元素與其他語言完全不同,這是因為 Go 中缺少內建功能來從切片中刪除元素。

從給定切片建立子切片

在深入研究從切片中刪除元素之前,我們將首先從給定的切片中建立子切片,因為它是從切片中刪除元素的主要組成部分之一。

package main

import "fmt"

func main() {
    var Slice1 = []int{1, 2, 3, 4}
    fmt.Printf("slice1: %v\n", Slice1)

    Slice2 := Slice1[:2]
    fmt.Printf("slice2: %v\n", Slice2)
}

輸出:

slice1: [1 2 3 4]
slice2: [1 2]

這裡,slice2 是由 slice1 形成的子切片,其包含從開始-即索引 0,到索引 2-11 的所有元素。請注意,Go 中的 slice 索引從 0 開始。

package main

import "fmt"

func main() {
    var Slice1 = []int{1, 2, 3, 4}
    fmt.Printf("slice1: %v\n", Slice1)

    Slice2 := Slice1[2:]
    fmt.Printf("slice2: %v\n", Slice2)
}

輸出:

slice1: [1 2 3 4]
slice2: [3 4]

這裡,slice2 是由 slice1 組成的子切片,其中包含從索引 2 到切片末尾的所有元素。

在 Go 中從切片中刪除元素

根據我們的要求,可以通過不同的方法來完成從切片中刪除元素的任務。下面討論了從 slice 中刪除元素的各種方法:

當排序重要時

如果我們希望在刪除元素後保持切片的順序,則將已刪除元素右側的所有元素的位置向左移動一個。

package main

import "fmt"

func remove(slice []int, s int) []int {
    return append(slice[:s], slice[s+1:]...)
}

func main() {
    var Slice1 = []int{1, 2, 3, 4, 5}
    fmt.Printf("slice1: %v\n", Slice1)

    Slice2 := remove(Slice1, 2)
    fmt.Printf("slice2: %v\n", Slice2)
}

輸出:

slice1: [1 2 3 4 5]
slice2: [1 2 4 5]

在此,從 slice1 中刪除索引 2 中的元素後,形成 slice2

當順序不重要時

package main

import "fmt"

func remove(s []int, i int) []int {
    s[i] = s[len(s)-1]
    return s[:len(s)-1]
}

func main() {
    var Slice1 = []int{1, 2, 3, 4, 5}
    fmt.Printf("slice1: %v\n", Slice1)

    Slice2 := remove(Slice1, 2)
    fmt.Printf("slice2: %v\n", Slice2)
}

輸出:

slice1: [1 2 3 4 5]
slice2: [1 2 5 4]

在這裡,從 slice1 中刪除索引 2 處的元素後,形成了 slice2,但此處未保留元素的順序。它比以前的方法快。

因此,當順序的優先順序高於速度時,我們使用第一種方法,如果速度的優先順序高於順序,則使用第二種方法從切片中刪除元素。

作者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

相關文章 - Go Slice