在golang 切片的帽子和镜头有什么不同?

根据定义:

切片既有长度又有容量.

切片的长度是它包含的元素的数量.

切片的容量是底层数组中的元素数,从切片中的第一个元素开始计算.

x := make([]int, 0, 5) // len(b)=0, cap(b)=5

len是否仅表示非空值?

推荐答案

片是在幕后使用数组的抽象.

cap告诉您底层数组的容量.len告诉您数组中有多少项.

Go中的切片抽象非常好,因为它将为您调整底层数组的大小,而且Go中的数组无法调整大小,因此几乎总是使用切片来代替.

例子:

s := make([]int, 0, 3)
for i := 0; i < 5; i++ {
    s = append(s, i)
    fmt.Printf("cap %v, len %v, %p\n", cap(s), len(s), s)
}

将输出类似以下内容的内容:

cap 3, len 1, 0x1040e130
cap 3, len 2, 0x1040e130
cap 3, len 3, 0x1040e130
cap 6, len 4, 0x10432220
cap 6, len 5, 0x10432220

正如您所见,一旦满足容量,append将返回一个容量更大的新片.在第四次迭代中,你会发现一个更大的容量和一个新的指针地址.

Play example

我知道您没有问到数组和追加的问题,但是它们对于理解片断和内置的原因是非常基础的.

Go相关问答推荐

Go汇编器命名为Constants

按键值排序字符串- Golang

有没有办法通过Go cmdline或IDE(IntelliJ)找出我的 struct 实现了什么接口?

格式化 Azure SDK 的 golang 时间

go测试10m后如何避免超时

优化方式中所有可能组合的字符串相似度

当我使用 CircleCI 构建 Go Image 时,我得到runtime/cgo: pthread_create failed: Operation not allowed

linter 警告:返回值被忽略

Yocto 无法交叉编译 GoLang Wails 应用程序

如何确定作为函数参数传递的指针是否正在被修改或副本是否正在被修改?

go-echo中如何防止+转义

从数据库中带有 imageurl 的文件夹中获取图像,并在我的浏览器中用 golang 中的 echo 显示

速率限制特定端点

在 Go GRPC 服务器流式拦截器上修改元数据

具有未导出字段的 struct 类型之间的转换

Golang invopop jsonschema 使用 if/then/else

在 go 中将运行命令的标准输出发送到其标准输入

Golang grpc go.mod 问题

如何 Select 前 N 个元素 Gin-Gorm

为什么我不能使用来自 gocloak 中 Login() 的访问令牌在 KeyCloak 中创建新客户端?