我的代码片段

package main

import "fmt"

func main() {
    s := []int{2, 3, 5, 7, 11, 13}
    fmt.Println("check 1: ",s, len(s))
    
    s = s[1:4]
    fmt.Println("check 2: ",s, len(s))

    s = s[3:5]
    fmt.Println("check 3: ",s, len(s))

    s = s[1:]
    fmt.Println("check 4: ",s, len(s))
}

输出

check 1:  [2 3 5 7 11 13] 6
check 2:  [3 5 7] 3
check 3:  [11 13] 2
check 4:  [13] 1

My Expected 输出

check 1:  [2 3 5 7 11 13] 6
check 2:  [3 5 7] 3
panic: runtime error: slice bounds out of range [3:5]

我们在这里更新了切片变量S,它现在包含[3 5 7],s = s[3:5]应该给出out of range error,因为索引3到5在S的新值中不存在

相反,为什么输出打印-[11 13]

推荐答案

正如Golang文档中所提到的--片不存储任何数据,它只是描述底层数组的一部分. 切片既有长度又有容量. 切片的长度是它所包含的元素的数量. 片的容量是底层数组中的元素数,从片中的第一个元素开始计算. S切片的长度和容量可以使用表达式LEN(S)和CAP(S)来获得.

虽然执行s[1:4]后的长度是3,但容量是5,因此您可以从底层数组访问S[3:5],而不会出现索引输出错误

try 下面的片段以更好地理解

package main

import "fmt"

func main() {
    s := []int{2, 3, 5, 7, 11, 13}
    fmt.Printf("check 1: len=%d cap=%d %v\n", len(s), cap(s), s)

    s = s[1:4]
    fmt.Printf("check 2: len=%d cap=%d %v\n", len(s), cap(s), s)

    s = s[3:5]
    fmt.Printf("check 4: len=%d cap=%d %v\n", len(s), cap(s), s)

    s = s[1:]
    fmt.Printf("check 5: len=%d cap=%d %v\n", len(s), cap(s), s)
}

输出:

check 1: len=6 cap=6 [2 3 5 7 11 13]
check 2: len=3 cap=5 [3 5 7]
check 4: len=2 cap=2 [11 13]
check 5: len=1 cap=1 [13]

Go相关问答推荐

区分Terminal和Hook Zerolog Go中的错误级别日志(log)输出

语法-for循环中的initit陈述是否允许分配?

读取JSON数据并在网页上显示

允许在 struct 中使用复合作为函数参数

如何使用工作区方法扩展克隆的Golang库

在GO中创建[]字符串类型的变量

如何在v2 Go SDK中使用KeyConditionExpression查询AWS DynamoDb?

杜松子wine 和中间件

AWS Lambda 中的 Websocket URL 超时达到错误

Go Programming Language书上的例子server2错了吗?

GoLang:net.LookupHost 返回重复的 ips

使用 Go 解组 SOAP 消息

go version -m 输出中的箭头符号=>是什么意思?

在 Raspberry Pi4 上下载 Go Mod

具有近似约束的函数值导致的实例化失败

golang 如何从字符串中查找表情符号?

实现接口的指针的泛型类型是什么?

正确编码 JWT

gqlgen go,通过添加一个解析器来减少数据库调用

行之间的模板交替设计