不说废话,直接上货,能懂则懂,不能懂则略过
package main
import (
"fmt"
"unsafe"
)
func main() {
fmt.Println()
// 切片
// 创建一个切片给变量a,这个切片的长度为0,其底层数组长度为8(常称之为容量)
// 切片a的数据结构 struct{ptr: 0x0, len: 0, cap: 8} 占用24字节(72位)
// ptr:占8字节 是一个指针 存储的是底层数组的内存地址
// len:占8字节 是切片的长度
// cap: 占8字节 是底层数组的长度
a := make([]int8, 0, 10)
b := append(a, 2)
_ = append(a, 3)
_ = append(a, []int8{4, 5}...)
_ = append(a, []int8{4, 5, 6}...)
_ = append(a, []int8{4, 5, 6, 7}...)
// 切片a的数据结构
ptra := (*uint64)(unsafe.Pointer(&a)) // 占8字节 指向的是底层数组
ptral := *(*int64)(unsafe.Pointer(uintptr(unsafe.Pointer(ptra)) + 8)) // 占8字节 切片的长度
ptrac := *(*int64)(unsafe.Pointer(uintptr(unsafe.Pointer(ptra)) + 16)) // 占8字节 切片的容量
fmt.Printf("切片a的地址:%#x 底层数组:0x%x 长度:%d 容量:%d 数据:%v\n