我的问题是关于切片长度和容量.我正在学习Go Here:https://tour.golang.org/moretypes/11.

(我的问题被标记为可能与this重复;然而,情况并非如此.我的问题具体是关于切掉切片的前几个元素以及这一点的影响.)

为什么线路s = s[2:]降低了运力,而s = s[:4]s = s[:0]没有呢?我看到的唯一区别是s = s[2:]的冒号前面有一个数字,而另外两行冒号后面有一个数字.

有没有办法恢复我们用s = s[2:]切断的前两个元素?

package main

import "fmt"

func main() {
    s := []int{2, 3, 5, 7, 11, 13}
    printSlice(s)

    // Slice the slice to give it zero length.
    s = s[:0]
    printSlice(s)

    // Extend its length.
    s = s[:4]
    printSlice(s)

    // Drop its first two values.
    s = s[2:]
    printSlice(s)
}

func printSlice(s []int) {
    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}

单击Run按钮后,我们将看到以下内容.

len=6 cap=6 [2 3 5 7 11 13]
len=0 cap=6 []
len=4 cap=6 [2 3 5 7]
len=2 cap=4 [5 7]

推荐答案

你可以阅读更多关于切片here的内容.但我认为这段话回答了你的问题:

切片不会复制切片的数据.它会创建一个指向原始数组的新切片值.这使得切片操作与操作数组索引一样高效.因此,修改重新切片的元素(而不是切片本身)会修改原始切片的元素.

因此,如果将切片数据赋给同一变量,则无法恢复切片数据.

容量减少是因为通过删除前2个元素,您更改了指向新切片的指针(切片由指向第一个元素的指针引用).

切片在内存中的表示方式: def

make([]byte, 5)

memory vis

s = s[2:4]

slice cap decrease

Go相关问答推荐

迭代项列表时如何超时并发调用

Go 1.22 http mux:在同一路径上提供一个手柄和一个FS

更改位置级别和时间戳零点Golang

Wamtime Memory中的‘Offset’是什么?Read?

如何使用Gio设置标题栏图标

GORM:一个表的两个外键

Go 是否提供了标准或事实上的方法来处理单个语句中的错误(即内联错误处理)?

Go Gin:验证 base64

如何在golang中使用viper获取对象的配置数组?

Go 中的 Azure JWT 验证不起作用

如何从 Asterisk Manager Interface Event 获取活动呼叫数

Neptune 在连接到启用 IAM 的 Neptune 实例时抛出握手错误错误

如何将 base64 编码的公钥转换为 crypto.PublicKey 或 ecdsa.PublicKey

使用 Golang SQL 驱动程序连接到snowflake

如何在 Golang 中使用具有相同名称或特定关键字的行或列重新排列/排序 CSV

在 Golang 中获取谷歌云服务帐户的访问令牌?

将基本 HTTP AUth 用户/密码凭据存储在 GO 中,无需外部包

泛型:对具有返回自身的函数的类型的约束

如何使用通用字段初始化匿名struct数组

Golang LinkedList 删除第一个元素