GoLang:如何从2D切片中删除元素?

时间:2015-12-05 08:04:48

标签: arrays multidimensional-array go append slice

我最近一直在搞乱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 个答案:

答案 0 :(得分:3)

Go中的2D切片只不过是一片切片。因此,如果要从此2D切片中删除元素,实际上您仍然只需要从切片中移除元素(这是另一个切片的元素)。

没有更多的参与。您唯一需要注意的是,当您从行切片中删除元素时,结果将只是“外部”切片的行(元素)的“新”值,而不是2D切片本身。因此,您必须将结果分配给外部切片的元素,以及刚刚删除其元素的行:

// Remove element at the ith row and jth column:
s[i] = append(s[i][:j], s[i][j+1:]...)

请注意,如果我们将s[i]替换为a,这与简单的“从切片中移除”相同(不出所料,因为s[i]表示“行切片”,其jth 1}}我们要删除的元素:

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 :(得分: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-th行,从中移除元素append(b[i][:j], b[i][j+1:]...),然后将这行放在行之间。

如果有人会告诉你如何附加许多元素,那么它看起来会更好。