登录
首页 >  Golang >  Go问答

在切片达到最大大小时如何处理附加项目

来源:stackoverflow

时间:2024-03-05 12:42:27 223浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《在切片达到最大大小时如何处理附加项目》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

我对附加到已经具有最大可能大小的切片时的行为感到困惑。

据我了解,切片的最大大小可以为 int32 或 int64,具体取决于您的系统。

执行 test := make([]struct{},math.maxint64+1) 时,我在 make([]struct {}) 中收到错误 len 参数太大,这在我的预期之内。 但是当做这样的事情时:

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)


解决方案


规范说任何切片的大约为 length and capacity

任何时候以下关系都成立:

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

这显然是违反的,因为长度变为负数,因此小于 0。所以这是一个错误,已经报告它并且可以在此处跟踪进度:https://github.com/golang/go/issues/29190

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

正如我们所见,一旦达到 32 位架构上的 maxint32 和 64 位架构上的 maxint64 ,容量就会停止增长。

理论要掌握,实操不能落!以上关于《在切片达到最大大小时如何处理附加项目》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>