← 返回 Go Runtime Lab 首页
1. 动态 Slice 内存模型交互
React Live Simulator
type slice struct {
array unsafe.Pointer
8 Bytes | 指向底层数组起始指针
0xC000018000
len int
8 Bytes | 切片当前长度 (Length)
3
cap int
8 Bytes | 切片当前容量 (Capacity)
5
} // 总计 24 Bytes (64位架构)
追加元素值 (Append):
⚡ Append 元素
切片截取 s[low : high : max]:
✂️ 执行 Reslice
重置为 make([]int, 3, 5)
重置为空切片 nil
底层数组内存块视角 (Underlying Array)
Array ID: #1 (5 元素容量块)
10
[0]
+0B
20
[1]
+8B
30
[2]
+16B
0
[3]
+24B
0
[4]
+32B
nil
[5]
+40B
Length 范围 (len = 3)
Capacity 范围 (cap = 5)
未包含/未分配内存
实验室初始化成功: make([]int, 3, 5)
2. 扩容算法 (growslice) 计算器
Go 1.18+ 新规则
元素类型 (Element Type):
int64 / uint64 / 指针 (8 字节)
int32 / float32 (4 字节)
int16 / uint16 (2 字节)
byte / uint8 / bool (1 字节)
原切片容量 (oldCap):
追加后期望容量 (reqCap = len + n):
推导过程解析:
1
预估容量计算 (步骤 1)
原容量 oldCap (10) < 阈值 256,进行双倍扩容:newCap = 2 * oldCap = 20
2
内存规格向上对齐 (步骤 2)
预估需求: 20 × 8B = 160 字节。Go 内存分配器 RoundUp 内存规格至 160 字节
3
计算最终实际 Cap (步骤 3)
最终实际 Capacity = 160 字节 / 8B = 20
结论
原 cap
10
扩容至最终 cap
20
(实际分配内存
160 Bytes
)