Go 切片
切片结构
源码包 src/runtime/slice.go 中 定义 slice 的结构为
type slice struct {
array unsafe.Pointer
len int
cap int
}
array 指针指向底层数组
len 表示切片长度
cap 表示切片容量
切片扩容机制
go1.18之后:
growslice 方法中可以得知go切片扩容机制为:
1.当新切片需要的容量cap大于两倍扩容的容量,则直接按照新切片需要的容量扩容;
2.当原 slice 容量 < threshold 的时候,新 slice 容量变成原来的 2 倍;
3.当原 slice 容量 > threshold,进入一个循环,每次容量增加(旧容量+3*threshold)/4
if newLen > doublecap {
newcap = newLen
} else {
const threshold = 256
if oldCap < threshold {
newcap = doublecap
} else {
for 0 < newcap && newcap < newLen {
newcap += (newcap + 3*threshold) / 4
}
if newcap <= 0 {
newcap = newLen
}
}
}
切片共享底层数组的特性
package main
import "fmt"
func main() {
var arr = make([]int, 3, 5)
brr := append(arr, 8)
brr[0] = 1
fmt.Println(arr)
fmt.Println(brr)
}
母子切片内存共享与内存分离
package main
import "fmt"
func main() {
var arr = make([]int, 3, 5)
s1 := arr[1:3]
arr[1] = 1
fmt.Println(arr)
fmt.Println(s1)
fmt.Println("------AAAAAAAAAAAAAAAAAAAAAAAAAA------")
s1 = append(s1, 8)
fmt.Println(arr)
fmt.Println(s1)
fmt.Println("------BBBBBBBBBBBBBBBBBBBBBBBBBB------")
arr[1] = 7
fmt.Println(arr)
fmt.Println(s1)
fmt.Println("------CCCCCCCCCCCCCCCCCCCCCCCCCC------")
s1 = append(s1, 9)
s1 = append(s1, 10)
fmt.Println(arr)
fmt.Println(s1)
fmt.Println("------DDDDDDDDDDDDDDDDDDDDDDDDDD------")
arr[1] = 4
fmt.Println(len(arr), cap(arr))
fmt.Println(len(s1), cap(s1))
fmt.Println(arr)
fmt.Println(s1)
}
package main
import "fmt"
func main() {
arr := []int{1, 2, 3, 4, 5, 6}
s1 := arr[:3]
s2 := arr[3:]
fmt.Println(s1, len(s1), cap(s1))
fmt.Println(s2, len(s2), cap(s2))
foo(s1)
fmt.Println(s1)
fmt.Println(s2)
fmt.Println(arr)
}
func foo(sli []int) {
sli = append(sli, 10)
sli[3] = 11
}
返回切片会导致内存泄漏
func foo() []int {
var arr = make([]int, 30000, 30000)
s1 := arr[1:3]
return s1
}
在函数参数中使用切片指针
package main
import "fmt"
func main() {
var arr = make([]int, 3, 5)
f1(&arr)
fmt.Println(arr)
f2(&arr)
fmt.Println(arr)
f3(arr)
fmt.Println(arr)
}
func f1(arr *[]int) {
*arr = append(*arr, 9)
}
func f2(arr *[]int) {
*arr = (*arr)[1:]
}
func f3(arr []int) {
arr[0] = 1
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具