如何将二维切片压平成一维切片?

7 浏览
0 Comments

如何将二维切片压平成一维切片?

我有一个

arr := [][]int32 {{1,2,3} ,{4,5,6}, {7,8,9}}

我想要

newArr := []int32 {1,2,3,4,5,6,7,8,9}

在JS中,我可以这样做

arr1d = [].concat(...arr2d);

这是其中一种简单的方法,类似于这个

Go语言中有类似这样的功能吗?

0
0 Comments

如何将一个二维切片(2D slice)展平为一个一维切片(1D slice)?

在Go 1.18版本中,可以使用泛型(generics)来解决这个问题。具体的解决方法是通过使用for循环遍历二维切片中的每个子切片,并将子切片的元素逐个追加到一个新的切片中。

示例代码如下:

func Flatten[T any](lists [][]T) []T {

var res []T

for _, list := range lists {

res = append(res, list...)

}

return res

}

func main() {

w := [][]string{{"a", "b", "c"}, {"d", "e", "f"}}

v := Flatten(w)

fmt.Println(v) // [a b c d e f]

d := [][]uint64{{100, 200}, {3000, 4000}}

e := Flatten(d)

fmt.Println(e) // [100 200 3000 4000]

}

在上述代码中,首先定义了一个泛型函数`Flatten`,该函数接受一个二维切片作为参数,并返回一个一维切片。在函数内部,通过使用for循环遍历二维切片中的每个子切片,并将子切片的元素逐个追加到一个新的切片中。最后,返回这个新的一维切片。

在示例的`main`函数中,我们分别定义了两个二维切片`w`和`d`,并分别调用了`Flatten`函数将它们展平为一维切片。然后,通过打印输出验证了展平结果的正确性。

以上就是如何将一个二维切片展平为一个一维切片的解决方法。通过使用泛型和for循环,我们可以轻松地处理任意类型的切片。如果你想要在Go Playground中尝试这段代码,可以访问以下链接:[https://go.dev/play/p/X81g7GYFd4n](https://go.dev/play/p/X81g7GYFd4n)。

0
0 Comments

Go语言中没有通用的功能来拼接/连接切片,虽然有strings.Joinbytes.Join函数,但是它们只能用于字符串和字节切片。因此,如果想要将一个二维切片(2D slice)展平为一个一维切片(1D slice),需要使用循环来实现。

上述代码中,首先定义了一个空的一维切片newArr。然后,通过for循环遍历二维切片arr,对于每个元素a,使用append函数将其追加到newArr中。注意,append函数的参数为a...,表示将a的所有元素追加到newArr中。

这样,通过循环遍历并追加的方式,就可以将二维切片展平为一维切片。

需要注意的是,上述代码是在还没有引入泛型(generics)功能的情况下实现的。在Go语言引入泛型后,可能会在标准库中添加类似的功能,从而简化这个操作。

0