登录
首页 >  Golang >  Go问答

聊聊Go中怎么获取切片的底层数组

来源:Golang技术栈

时间:2023-03-23 15:12:30 174浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《聊聊Go中怎么获取切片的底层数组》,这篇文章主要会讲到golang等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

假设我有以下长度为 3 的整数数组:

nums := [3]int{1,2,3}

然后我抓住前两个项目的切片

numSlice := nums[:2]

调用capnumSlice 和 nums 在这两种情况下都会产生 3,并len分别产生 2 和 3。

如果我随后附加到该切片 ( numSlice = append(numSlice, 10)),则底层数组 ( nums) 现在是[1 2 10]cap两者都保持在 3,因为切片的底层数组是相同的,切片的 len 现在是 3。

但是,如果我再次附加到该切片numSlice = append(numSlice, 20)cap

很抱歉解释过度,只是让我自己了解一下,但是有人可以向我解释底层数组的幕后情况以及如何获取对新数组的引用吗?

正确答案

首先,如果您还没有阅读过,您应该阅读[这篇关于 slice internals 的官方博客文章](https://blog.golang.org/go- slices-usage-and-internals)。那应该清除一切。

现在要访问底层数组,您可以使用reflect和的组合unsafe。特别是,reflect.SliceHeader包含一个Data字段,该字段包含指向切片底层数组的指针。

改编自unsafe软件包文档的示例:

s := []int{1, 2, 3, 4}
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&s))
data := *(*[4]int)(unsafe.Pointer(hdr.Data))

终于介绍完啦!小伙伴们,这篇关于《聊聊Go中怎么获取切片的底层数组》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表