golang2021数据格式(93)获取slice与map长度
获取 slice 长度 #
通过前面关于 slice 的文章,我们知道了 slice header 的结构体定义:
1
2
3
4
5
6
// runtime/slice.go
type slice struct {
array unsafe.Pointer // 元素指针
len int // 长度
cap int // 容量
}
调用 make 函数新建一个 slice,底层调用的是 makeslice 函数,返回的是 slice 结构体:
1
func makeslice(et *_type, len, cap int) slice
因此我们可以通过 unsafe.Pointer 和 uintptr 进行转换,得到 slice 的字段值。
1
2
3
4
5
6
7
8func main() {
s := make([]int, 9, 20)
var Len = *(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + uintptr(8)))
fmt.Println(Len, len(s)) // 9 9
var Cap = *(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + uintptr(16)))
fmt.Println(Cap, cap(s)) // 20 20
}
Len,cap 的转换流程如下:
1
2
Len: &s => pointer => uintptr => pointer => *int => int
Cap: &s => pointer => uintptr => pointer => *int => int
获取 map 长度 #
再来看一下上篇文章我们讲到的 map:
1
2
3
4
5
6
7
8
9
10
11
12
13type hmap struct {
count int
flags uint8
B uint8
noverflow uint16
hash0 uint32
buckets unsafe.Pointer
oldbuckets unsafe.Pointer
nevacuate uintptr
extra *mapextra
}
和 slice 不同的是,makemap 函数返回的是 hmap 的指针,注意是指针:
1
func makemap(t *maptype, hint int64, h *hmap, bucket unsafe.Pointer) *hmap
我们依然能通过 unsafe.Pointer 和 uintptr 进行转换,得到 hamp 字段的值,只不过,现在 count 变成二级指针了:
1
2
3
4
5
6
7
8func main() {
mp := make(map[string]int)
mp["qcrao"] = 100
mp["stefno"] = 18
count := **(**int)(unsafe.Pointer(&mp))
fmt.Println(count, len(mp)) // 2 2
}
count 的转换过程:
1
&mp => pointer => **int => int
阿里女员工入住酒店否认违规制作房卡!主打人文情怀,数次IPO折戟中新经纬客户端8月11日电(付玉梅)阿里男高管疑似侵害女员工事件仍在发酵。其中,该名高管为何能顺利办理房卡进入女子房间,系事件的争议之一。女员工未披露涉事酒店名,酒店方也迟迟未出来
阿里,牵一发而动全身近期阿里事件很多人议论纷纷,各种对案件的分析头头是道,我可以很明确的告诉你,表相绝对不会是真相,女方的陈述,阿里的处理,等等现在都不是最重要的,看的懂的没人去看这个案子,都在看人民
区块链正在抛弃普通人最近这些天,我一直在思考。可以看出区块链技术的发展得越来越复杂,普通人想要去理解越来越难,已经远不止之前所谓的唯一性,不可篡改性,匿名性等概念,这些概念都是区块链的底层逻辑,而现在
PLC工控行业的远程控制方法工业控制领域在朝着智能互联的方向发展也随之出现了三大难题1。设备位置分布较分散,现场的设备运行状况难以监管。2。不同设备间的协议,接口,品牌不同,难以对接。3。原有网络结构简单,往
LinuxCentOS7开启ssh远程登录,附修改主机名的方法1。准备opensshserver输入以下命令检查是否已安装opensshserver,若已安装,则会输出相应信息rootsagecatyumlistinstalledgrepop
新能源车价值重估下低位氢燃料电池开启补涨财联社(上海编辑向阳)讯,近期作为新能源车概念之一的锂电池累积涨幅非常大,每个细分领域都有不错表现,而氢燃料电池却不温不火,走势可以说相对低迷,直到近几日才开始有部分标的逐步转强,
新能源汽车投资分析,不同技术的区别一文读懂从纯电动车(BEV)混合动力车(HEV)插电式混合动力车(PHEV)到轻混合动力车(MHEV),你对各类电动车知道多少?本文卦哥家财经为你逐一分析各类电动车。文卦哥家有鉴于对环境的
华为,为什么不受待见?文楚劲草华为,是全球创新能力排名第8(中国第1)的中国企业,全球品牌价值排名15(中国第4),是中国每年研发投入最多的企业,是中国纳税排名第3的企业,这样的一个巨无霸,多次被其他厂
小米11系列真的会烧wifi?官方推出服务政策,网友终于等到小米11系列的烧wifi问题一直以来就困扰着米粉们,终于小米官方回应了这件事,并做了一系列政策措施,比如支持换新机,退货,保修等,政策虽然来的晚了一点,但做的还不错,那么为什么小米
小米MIX4定档,8月10日他来了他来了雷布斯带着小米MIX4走来了。同时也迎来了小米10周年,雷军会有年度演讲。2016年小米MIX横空出世,屏占比高达91。3,定义了全面屏。2018年,小米MIX3开创性
北斗星通服务于5G通信和军工行业,受到国家大基金的扶持随着北斗三号全球卫星导航系统建成开通智能化时代的到来,我国北斗产业化进入了加速发展的黄金时期。北斗星通将顺应用户需求与商业模式变革技术融合发展等趋势,紧抓历史机遇,持续创新突破,开