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
函数。