Golang append 函数
最后修改时间 2025 年 5 月 8 日
本教程将解释如何在 Go 中使用内置的 append
函数。我们将通过实际的动态切片操作示例来涵盖切片基础知识。
append
函数用于向 Go 中的切片添加元素。它会在需要时处理底层数组的自动重定义大小。该函数返回一个包含所有原始元素以及新元素的新切片。
在 Go 中,append
对于处理动态集合至关重要。当切片超出其当前容量时,它可以有效地管理内存分配和复制。
基本 append 示例
append
最简单的用法是将元素添加到切片中。本示例演示了基本的切片追加。
注意: 始终将 append 的返回值赋给一个变量。
package main import "fmt" func main() { var nums []int // Append single elements nums = append(nums, 1) nums = append(nums, 2) nums = append(nums, 3) fmt.Println(nums) // [1 2 3] // Append multiple elements nums = append(nums, 4, 5, 6) fmt.Println(nums) // [1 2 3 4 5 6] }
该示例展示了单元素和多元素追加。每个 append 操作都会返回一个必须重新赋给变量的新切片。
向具有容量的切片追加
当切片具有足够的容量时,append 会重用底层数组。本示例演示了 append 操作期间的容量行为。
package main import "fmt" func main() { // Create slice with length 3 and capacity 5 nums := make([]int, 3, 5) nums[0], nums[1], nums[2] = 1, 2, 3 fmt.Printf("Before append: len=%d cap=%d %v\n", len(nums), cap(nums), nums) // Append within capacity nums = append(nums, 4) fmt.Printf("After first append: len=%d cap=%d %v\n", len(nums), cap(nums), nums) // Append beyond capacity nums = append(nums, 5, 6) fmt.Printf("After second append: len=%d cap=%d %v\n", len(nums), cap(nums), nums) }
由于容量足够,第一次 append 没有分配新内存。第二次 append 因为超过了容量而触发了新的分配。
将一个切片追加到另一个切片
我们可以使用展开运算符将一个切片的所有元素追加到另一个切片。本示例展示了如何高效地组合切片。
package main import "fmt" func main() { fruits := []string{"apple", "banana"} moreFruits := []string{"orange", "grape", "kiwi"} // Append all elements of moreFruits to fruits fruits = append(fruits, moreFruits...) fmt.Println(fruits) // [apple banana orange grape kiwi] // Create new slice by combining allFruits := append([]string{}, fruits...) allFruits = append(allFruits, "melon") fmt.Println(allFruits) // [apple banana orange grape kiwi melon] }
...
运算符将切片展开为单独的元素。这种模式对于在没有嵌套切片结构的情况下组合切片很有用。
向 nil 切片追加
Append 可以与 nil 切片一起使用,并在需要时自动创建新切片。本示例演示了 append 对 nil 切片行为。
package main import "fmt" func main() { var nilSlice []int fmt.Printf("nilSlice: len=%d cap=%d %v\n", len(nilSlice), cap(nilSlice), nilSlice) // Append to nil slice nilSlice = append(nilSlice, 10) fmt.Printf("After append: len=%d cap=%d %v\n", len(nilSlice), cap(nilSlice), nilSlice) // Multiple appends nilSlice = append(nilSlice, 20, 30, 40) fmt.Printf("Final state: len=%d cap=%d %v\n", len(nilSlice), cap(nilSlice), nilSlice) }
当与 append 一起使用时,nil 切片表现得像一个空切片。在第一次向 nil 切片追加时,Go 会自动处理初始分配。
使用接口追加不同类型
我们可以通过使用空接口将不同类型追加到切片中。本示例演示了带有 append 的异构集合。
package main import "fmt" func main() { var items []interface{} items = append(items, 42) items = append(items, "hello") items = append(items, 3.14) items = append(items, true) for i, item := range items { fmt.Printf("Item %d: %v (%T)\n", i, item, item) } }
空接口 interface{}
允许存储任何类型。尽管元素位于同一个切片中,但每个元素都保留其原始类型信息。
来源
本教程通过动态切片操作和增长模式的实际示例,涵盖了 Go 中的 append
函数。