为了账号安全,请及时绑定邮箱和手机立即绑定

将项目附加到最大大小切片时的附加行为

将项目附加到最大大小切片时的附加行为

Go
POPMUISE 2023-05-15 15:18:42
我对附加到已经具有最大可能大小的切片时的行为感到困惑。据我了解,切片的最大大小可以是 int32 或 int64,具体取决于您的系统。执行时,我得到了符合我预期的test := make([]struct{},math.MaxInt64+1)错误。len argument too large in make([]struct {})但是当做类似的事情时:test := make([]struct{},math.MaxInt64)for i:=0;i<100 ; i++ {    test = append(test, struct{}{})}fmt.Println(len(test))我预计程序会出现恐慌,但令人惊讶的是,代码运行时没有任何问题,并len返回一个溢出的值-9223372036854775709。有人可以详细说明这种行为吗?(我用的是go1.11.2 linux/amd64)
查看完整描述

1 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

规范说明了任何切片的长度和容量:

在任何时候都存在以下关系:

0 <= len(s) <= cap(s)

这显然违反了,因为长度变为负数,因此小于 0。

Ian Lance Taylor 确认这是一个错误,而不是它应该如何工作。正确的行为应该是恐慌的说法growslice: cap out of range,它应该源自slice.go / growslice()函数(growslice()被称为来自append())。

如果我们将您的示例稍微修改为:

s := make([]struct{}, math.MaxInt32-2)

fmt.Println(len(s), cap(s))

for i := 0; i < 5; i++ {

    s = append(s, struct{}{})

    fmt.Println(len(s), cap(s))

}

并在Go Playground上运行它:


2147483645 2147483645

2147483646 2147483646

2147483647 2147483647

-2147483648 2147483647

-2147483647 2147483647

-2147483646 2147483647

MaxInt32正如我们所看到的,一旦达到32 位架构和MaxInt6464 位架构,容量就会停止增长。


查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信