来,今天我带你彻底搞懂Go语言里这个让人又爱又恨的append()函数!
“为什么我追加了元素,切片还是空的?!”——这是无数Go语言新手在使用append()函数时的灵魂拷问。看似简单的append(),却是Go语言中最容易踩坑的特性之一。今天,我们就来彻底剖析这个函数,让你从此告别误区!
前言:从一個让人崩溃的例子开始
先来看一段让很多Go初学者崩溃的代码:
package main
import "fmt"
func main() {
var slice []int
append(slice, 1, 2, 3)
fmt.Println(slice) // 输出:[] (仍然是空切片!)
}
运行这段代码,你会发现输出仍然是空切片,而不是期望的[1 2 3]。如果你也遇到过这种情况,别担心,看完本文你就明白为什么了。
切片基础:了解它的内在结构
在深入append()之前,我们需要快速了解Go切片的结构。切片本身并不是数组,而是对底层数组的一个"视图",包含三个关键信息:
- 指针:指向底层数组中切片起始位置的指针
- 长度:切片中当前包含的元素个数(len(slice))
- 容量:从切片起始位置到底层数组末尾的元素个数(cap(slice))
这样的设计使得切片比数组更灵活,但同时也带来了一些独特的行为特性。
append()函数的核心机制
基本语法
append()函数是Go语言的内置函数,用于向切片追加元素,其基本语法如下:
func append(slice []Type, elems ...Type) []Type
关键特性:它总是返回新切片!
这是理解append()的关键:append()不会修改原切片,而是返回一个新的切片。
为什么这样设计?因为追加元素可能导致底层数组的重新分配。当切片的容量不足以容纳新元素时,Go会创建一个新的、更大的底层数组,将原有元素复制到新数组,然后在新数组中追加新元素。<

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



