我有
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 有
strings.Join
和 bytes.Join
,但没有连接/连接切片的通用功能。 一旦将泛型引入到语言中,此类功能可能会被添加到标准库中。
同时,用循环来做这件事已经足够清晰和简洁了。
var newArr []int32
for _, a := range arr {
newArr = append(newArr, a...)
}
你无法避免 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]
}
正如 Eli Bendersky 所预测的,从 Go 1.22 开始,你有 slices.Concat