Golang slices.Concat
最后修改于 2025 年 4 月 20 日
本教程将解释如何在 Go 中使用 slices.Concat 函数。我们将通过实际示例介绍切片连接(合并切片)。
slices.Concat 函数将多个切片合并成一个新的切片。它是 Go 实验性 slices 包的一部分。
此函数有助于合并来自不同来源的数据或组合多个操作的结果。它会保留元素的顺序。
基本 slices.Concat 示例
slices.Concat 最简单的用法是连接两个整数切片。结果包含两个切片的所有元素,并保持原顺序。
package main
import (
"fmt"
"slices"
)
func main() {
slice1 := []int{1, 2, 3}
slice2 := []int{4, 5, 6}
combined := slices.Concat(slice1, slice2)
fmt.Println("Combined slice:", combined)
}
我们创建两个切片并将它们连接成一个。新切片包含 slice1 的所有元素,然后是 slice2 的所有元素。
连接多个切片
slices.Concat 一次可以合并两个以上的切片。此示例展示了三个字符串切片的连接。
package main
import (
"fmt"
"slices"
)
func main() {
fruits := []string{"apple", "banana"}
veggies := []string{"carrot", "potato"}
meats := []string{"chicken", "beef"}
allFood := slices.Concat(fruits, veggies, meats)
fmt.Println("All food items:", allFood)
}
该函数接受任意数量的切片参数。结果会保持参数中提供的切片及其元素的顺序。
处理不同类型
传递给 slices.Concat 的所有切片必须是同一类型。此示例演示了使用自定义结构体类型的连接。
package main
import (
"fmt"
"slices"
)
type Person struct {
Name string
Age int
}
func main() {
group1 := []Person{{"Alice", 25}, {"Bob", 30}}
group2 := []Person{{"Charlie", 17}, {"Dana", 40}}
allPeople := slices.Concat(group1, group2)
fmt.Println("All people:", allPeople)
}
我们合并了两个 Person 结构体切片。类型安全确保结果切片中的所有元素都是同一类型。
空切片行为
slices.Concat 可以很好地处理空切片。此示例显示了与空切片的连接。
package main
import (
"fmt"
"slices"
)
func main() {
empty := []int{}
numbers := []int{1, 2, 3}
result := slices.Concat(empty, numbers, empty)
fmt.Println("Result with empty slices:", result)
}
空切片不贡献元素,但也不会导致错误。结果只包含非空切片的元素。
性能注意事项
对于大型切片,连接性能很重要。此示例通过不同大小的切片对该操作进行了基准测试。
package main
import (
"fmt"
"slices"
"time"
)
func main() {
large1 := make([]int, 1_000_000)
large2 := make([]int, 1_000_000)
start := time.Now()
_ = slices.Concat(large1, large2)
fmt.Println("Concatenation time:", time.Since(start))
}
slices.Concat 会分配一个容量足以容纳所有元素的新切片。然后,它将每个源切片的元素复制到新切片中。
修改连接后的切片
对原始切片的更改不会影响连接后的结果。此示例演示了这种独立性。
package main
import (
"fmt"
"slices"
)
func main() {
original1 := []int{1, 2, 3}
original2 := []int{4, 5, 6}
combined := slices.Concat(original1, original2)
original1[0] = 99
fmt.Println("Original 1:", original1)
fmt.Println("Combined:", combined)
}
修改原始切片中的元素不会改变连接后的结果。该函数创建了一个全新的切片。
实际示例:合并结果
这个实际示例展示了如何使用 slices.Concat 合并不同操作的结果。
package main
import (
"fmt"
"slices"
)
func getEvenNumbers(max int) []int {
var evens []int
for i := 0; i <= max; i += 2 {
evens = append(evens, i)
}
return evens
}
func getOddNumbers(max int) []int {
var odds []int
for i := 1; i <= max; i += 2 {
odds = append(odds, i)
}
return odds
}
func main() {
evens := getEvenNumbers(10)
odds := getOddNumbers(10)
allNumbers := slices.Concat(evens, odds)
fmt.Println("All numbers:", allNumbers)
}
我们分别生成偶数和奇数,然后将它们合并。当收集来自不同来源或操作的结果时,这种模式很有用。
来源
本教程通过各种场景下合并切片的实际示例,介绍了 Go 中的 slices.Concat 函数。