golang slice底层
此问题由以下场景展开研究:
package main
import (
"fmt"
"unsafe"
)
func main() {
a := [5]int8{1, 2, 3, 4, 5}
fmt.Print(unsafe.Sizeof(a)) //5
s := []int8{1, 2, 3, 4, 5}
fmt.Print(unsafe.Sizeof(s)) //24
}
slice底层定义
编译期间的切片是cmd/compile/internal/types.Slice
类型的,但是在运行时切片可以由如下的 reflect.SliceHeader
结构体表示,其中:
Data
是指向数组的指针;Len
是当前切片的长度;Cap
是当前切片的容量,即Data
数组的大小:
type SliceHeader struct {
Data uintptr //8个字节
Len int //8个字节
Cap int //8个字节
}