ZetCode

Golang slices.Concat

最后修改于 2025 年 4 月 20 日

本教程将解释如何在 Go 中使用 slices.Concat 函数。我们将通过实际示例介绍切片连接(合并切片)。

slices.Concat 函数将多个切片合并成一个新的切片。它是 Go 实验性 slices 包的一部分。

此函数有助于合并来自不同来源的数据或组合多个操作的结果。它会保留元素的顺序。

基本 slices.Concat 示例

slices.Concat 最简单的用法是连接两个整数切片。结果包含两个切片的所有元素,并保持原顺序。

basic_concat.go
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 一次可以合并两个以上的切片。此示例展示了三个字符串切片的连接。

multi_concat.go
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 的所有切片必须是同一类型。此示例演示了使用自定义结构体类型的连接。

struct_concat.go
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 可以很好地处理空切片。此示例显示了与空切片的连接。

empty_concat.go
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)
}

空切片不贡献元素,但也不会导致错误。结果只包含非空切片的元素。

性能注意事项

对于大型切片,连接性能很重要。此示例通过不同大小的切片对该操作进行了基准测试。

performance_concat.go
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 会分配一个容量足以容纳所有元素的新切片。然后,它将每个源切片的元素复制到新切片中。

修改连接后的切片

对原始切片的更改不会影响连接后的结果。此示例演示了这种独立性。

modify_concat.go
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 合并不同操作的结果。

practical_concat.go
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 实验性切片包文档

本教程通过各种场景下合并切片的实际示例,介绍了 Go 中的 slices.Concat 函数。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出所有 Go 教程