GoLang:如何从二维切片中删除元素?

4

我最近在研究Go语言,并想知道如何从二维切片中删除元素。

对于删除一维切片中的元素,我可以使用以下代码:

data = append(data[:i], data[i+1:]...)

然而,使用二维切片时,可以使用以下代码:

data = append(data[i][:j], data[i][j+1:]...)

抛出错误:

cannot use append(data[i][:j], data[i][j+1:]...) (type []string) as type [][]string in assignment

需要应对这个问题,是否需要采取不同的方法?
2个回答

3
在Go语言中,2D切片只是一个切片的切片。因此,如果你想从这个2D切片中删除一个元素,实际上你仍然只需要从一个切片(另一个切片的元素)中删除一个元素。
没有更多的步骤。唯一要注意的是,当从行切片中删除一个元素时,结果只会是“外部”切片的行(一个元素)的“新”值,而不是2D切片本身。所以你必须将结果分配给外部切片的一个元素,即刚刚删除其元素的行:
// Remove element at the ith row and jth column:
s[i] = append(s[i][:j], s[i][j+1:]...)

请注意,如果我们用a替换s[i],则这与简单的“从切片中删除”操作相同(这并不奇怪,因为s[i]表示要删除其第j个元素的“行切片”):

a = append(a[:j], a[j+1:]...)

请查看这个完整的例子:

s := [][]int{
    {0, 1, 2, 3},
    {4, 5, 6, 7},
    {8, 9, 10, 11},
}

fmt.Println(s)

// Delete element s[1][2] (which is 6)
i, j := 1, 2
s[i] = append(s[i][:j], s[i][j+1:]...)

fmt.Println(s)

输出结果(在Go Playground中尝试):

[[0 1 2 3] [4 5 6 7] [8 9 10 11]]
[[0 1 2 3] [4 5 7] [8 9 10 11]]

1
这是其中一种可能的方法 Go Playground
b := [][]int{
    []int{1, 2, 3, 4},
    []int{5, 6, 7, 8},
    []int{9, 0, -1, -2},
    []int{-3, -4, -5, -6},
}
print2D(b)
i, j := 2, 2


tmp := append(b[i][:j], b[i][j+1:]...)
c := append(b[:i], tmp)
c = append(c, b[i+1:]...)
print2D(c)

基本上,我正在提取第 i 行,从中删除元素 append(b[i][:j], b[i][j+1:]...),然后将此行放在其他行之间。
如果有人告诉如何添加多个元素,它看起来会更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接