如何将 2D 切片展平为 1D 切片?

问题描述 投票:0回答:3

我有

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);

作为许多简单方法之一,例如this

Go 中有这样的东西吗?

go slice flatten
3个回答
4
投票

Go 有

strings.Join
bytes.Join
,但没有连接/连接切片的通用功能。 一旦将泛型引入到语言中,此类功能可能会被添加到标准库中。

同时,用循环来做这件事已经足够清晰和简洁了。

var newArr []int32
for _, a := range arr {
  newArr = append(newArr, a...)
}

2
投票

去1.18

你无法避免 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]
}

游乐场:https://go.dev/play/p/X81g7GYFd4n


0
投票

正如 Eli Bendersky 所预测的,从 Go 1.22 开始,你有 slices.Concat

© www.soinside.com 2019 - 2024. All rights reserved.