Golang slices.AppendSeq
最后修改于 2025 年 4 月 20 日
本教程将介绍如何在 Go 中使用 slices.AppendSeq 函数。我们将通过实际示例介绍切片操作以及追加元素。
slices.AppendSeq 函数可以在一次操作中将多个元素追加到切片。它是 Go 实验性 slices 包的一部分。
该函数提供了一种方便的方式来一次性添加多个元素,同时高效地处理内存分配。它返回一个包含所有元素的新切片。
基本 slices.AppendSeq 示例
slices.AppendSeq 最简单的用法是将数字追加到切片。我们从一个初始切片开始,然后添加多个值。
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 可与任何切片类型一起使用。此示例将字符串追加到字符串切片。
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 开始构建切片。
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 可以与展开运算符结合使用来合并切片。此示例演示了合并两个切片。
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 类型。
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 调用进行比较。我们测量性能差异。
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 从各个部分构建命令字符串。
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 中的 slices.AppendSeq 函数。