Golang 切片详解一 内存布局

本文深入探讨了Golang切片的数据结构,指出切片由3部分组成:底层数组的内存地址、切片长度和容量,各占8字节,总计24字节。
摘要由CSDN通过智能技术生成

 不说废话,直接上货,能懂则懂,不能懂则略过

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值