我是围棋新手,正在读一本由O‘Reilly出版的名为《学习围棋》的书.在阅读有关Slice的文章时,有一条声明如下:

要增加存储片的大小,从GO 1.14开始,其规则是将容量加倍,直到达到1024个存储片的大小,然后以25%的速度增长.我写了一个简单的围棋代码来证明这一点.

package main

import "fmt"

func main() {
    var length uint16 = 1024

    var x []int

    for i := 0; i < int(length); i++ {
        x = append(x, i)
        fmt.Printf("\nLength is %d. Capacity is %d", len(x), cap(x))
    }
}

从0到len(X)==512已被证明Go运行时使容量加倍(也称为大小)是真的.但对我来说,有趣的部分从这里开始:当len(X)&gt;=512时,我预计容量是1024,即512*2=1024.然而,结果如下:

Length is 513. Capacity is 848 个 因此,这大约是65%的增长.有人能给我解释一下吗?

推荐答案

从GO 1.14开始

GO 1.20刚刚发布(发布时间为2023-02-01).GO 1.21的工作已经开始.阅读Go源代码,查看自Go 1.14(发布于2020-02-25)以来的变化.

例如,

Go/SRC/Runtime/slice.go:

// Transition from growing 2x for small slices
// to growing 1.25x for large slices. This formula
// gives a smooth-ish transition between the two.

runtime: make slice growth formula a bit smoother个 (提交的Mon Sep 27 20:53:51 2021):

Instead of growing 2x for < 1024 elements and 1.25x for >= 1024 elements,
use a somewhat smoother formula for the growth factor. Start reducing
the growth factor after 256 elements, but slowly.

starting cap    growth factor
256             2.0
512             1.63
1024            1.44
2048            1.35
4096            1.30

(Note that the real growth factor, both before and now, is somewhat
larger because we round up to the next size class.)

Go相关问答推荐

GORM Find方法中缺少字段

减少在围棋中映射DTO时的重复代码量

为什么Slices包中的函数定义Slice参数的类型参数?

GO:如何指定类型约束,使S方法的参数类型与接收方的参数类型相同

如何配置vscode以在Go中显示不必要的(过度指定的)泛型?

如何根据中间件的请求设置上下文值?获取 go-staticcheck 问题

在 go 中,将接收器 struct 从值更改为指针是否向后兼容?

杜松子wine 和中间件

使用 Go 解组 SOAP 消息

具有嵌套重复的正则表达式

有没有办法约束(通用)类型参数?

使用图像解码 JPEG 时 colored颜色 不正确.解码并写入 PDF?

Golang 通过接口反映/迭代{}

Go 中的 HTTP 请求验证中间件

Golang:隐式 struct 匹配

Go 并发、goroutine 同步和关闭通道

转到文本/模板模板:如何根据模板本身的值数组判断值?

如何获取多个 url 参数值

如何在循环中旋转图像以便在 golang 中创建 GIF?

在 Go 中,为什么 exec.Command() 失败但 os.StartProcess() 成功启动winget.exe?