获取 slice 长度 #
通过前面关于 slice 的文章,我们知道了 slice header 的结构体定义:
1 | // runtime/slice.go |
调用 make 函数新建一个 slice,底层调用的是 makeslice 函数,返回的是 slice 结构体:
1 | func makeslice(et *_type, len, cap int) slice |
因此我们可以通过 unsafe.Pointer 和 uintptr 进行转换,得到 slice 的字段值。
1 | func main() { var Cap = *(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + uintptr(16))) |
Len,cap 的转换流程如下:
1 | Len: &s => pointer => uintptr => pointer => *int => int |
获取 map 长度 #
再来看一下上篇文章我们讲到的 map:
1 | type hmap struct { buckets unsafe.Pointer extra *mapextra |
和 slice 不同的是,makemap 函数返回的是 hmap 的指针,注意是指针:
1 | func makemap(t *maptype, hint int64, h *hmap, bucket unsafe.Pointer) *hmap |
我们依然能通过 unsafe.Pointer 和 uintptr 进行转换,得到 hamp 字段的值,只不过,现在 count 变成二级指针了:
1 | func main() { count := **(**int)(unsafe.Pointer(&mp)) |
count 的转换过程:
1 | &mp => pointer => **int => int |
页面更新:2024-05-07
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号