ZetCode

Golang slices.AppendSeq

最后修改于 2025 年 4 月 20 日

本教程将介绍如何在 Go 中使用 slices.AppendSeq 函数。我们将通过实际示例介绍切片操作以及追加元素。

slices.AppendSeq 函数可以在一次操作中将多个元素追加到切片。它是 Go 实验性 slices 包的一部分。

该函数提供了一种方便的方式来一次性添加多个元素,同时高效地处理内存分配。它返回一个包含所有元素的新切片。

基本 slices.AppendSeq 示例

slices.AppendSeq 最简单的用法是将数字追加到切片。我们从一个初始切片开始,然后添加多个值。

basic_append.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    numbers := []int{1, 2, 3}
    numbers = slices.AppendSeq(numbers, 4, 5, 6)
    
    fmt.Println("Appended numbers:", numbers)
}

我们创建一个包含三个数字的切片,并追加另外三个值。该函数返回一个包含所有六个元素的新切片,顺序保持不变。

追加不同类型

slices.AppendSeq 可与任何切片类型一起使用。此示例将字符串追加到字符串切片。

string_append.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    fruits := []string{"apple", "banana"}
    fruits = slices.AppendSeq(fruits, "cherry", "date", "elderberry")
    
    fmt.Println("Fruits:", fruits)
}

该函数将三个字符串元素追加到我们最初的两个元素的切片中。类型安全得到维护,因为所有元素都必须与切片类型匹配。

追加到空切片

我们可以将 slices.AppendSeq 与空切片一起使用。此示例从 nil 开始构建切片。

empty_append.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    var empty []float64
    numbers := slices.AppendSeq(empty, 1.1, 2.2, 3.3)
    
    fmt.Println("Created from empty:", numbers)
}

从 nil 切片开始,我们创建一个包含三个浮点值的新切片。该函数会自动处理初始分配。

合并多个切片

slices.AppendSeq 可以与展开运算符结合使用来合并切片。此示例演示了合并两个切片。

combine_slices.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    part1 := []int{1, 2, 3}
    part2 := []int{4, 5, 6}
    combined := slices.AppendSeq(part1, part2...)
    
    fmt.Println("Combined slices:", combined)
}

使用展开运算符 (...),我们将 part2 中的所有元素追加到 part1。这将创建一个包含两个切片中所有元素的新切片。

追加结构体值

我们可以使用 slices.AppendSeq 追加结构体实例。此示例使用自定义 Person 类型。

struct_append.go
package main

import (
    "fmt"
    "slices"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    people := []Person{{"Alice", 25}}
    people = slices.AppendSeq(people, Person{"Bob", 30}, Person{"Charlie", 17})
    
    fmt.Println("People:", people)
}

我们从一个人开始,然后追加另外两个人。该函数像处理基本类型一样处理结构体值,并保持类型安全。

性能比较

此示例将 slices.AppendSeq 与多个 append 调用进行比较。我们测量性能差异。

performance.go
package main

import (
    "fmt"
    "slices"
    "time"
)

func main() {
    const count = 1_000_000
    var base []int
    
    // Using slices.AppendSeq
    start := time.Now()
    base = slices.AppendSeq(base, make([]int, count)...)
    fmt.Println("AppendSeq duration:", time.Since(start))
    
    // Using multiple append calls
    start = time.Now()
    for i := 0; i < count; i++ {
        base = append(base, i)
    }
    fmt.Println("Multiple append duration:", time.Since(start))
}

slices.AppendSeq 对于批量操作通常更快,因为与多次单独的 append 调用相比,它可以更有效地分配内存。

实际示例:构建命令

这个实际示例使用 slices.AppendSeq 从各个部分构建命令字符串。

command_builder.go
package main

import (
    "fmt"
    "slices"
    "strings"
)

func main() {
    cmdParts := []string{"git", "commit"}
    flags := []string{"-m", "Initial commit"}
    
    fullCmd := slices.AppendSeq(cmdParts, flags...)
    command := strings.Join(fullCmd, " ")
    
    fmt.Println("Command:", command)
}

我们将基本命令部分与标志合并到一个切片中,然后将它们连接成一个用空格分隔的字符串。这展示了实际用法。

来源

Go 实验性切片包文档

本教程通过在各种场景下将元素追加到切片的实际示例,介绍了 Go 中的 slices.AppendSeq 函数。

作者

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

列出所有 Go 教程