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

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

然后我只拿前两件东西的切片

numSlice := nums[:2]

在numSlice和nums上调用cap在这两种情况下都会产生3,而len分别会产生2和3.

如果我随后附加到该片(numSlice = append(numSlice, 10)),那么底层数组(nums)现在是[1 2 10].cap对于这两个值都保持为3,因为切片的底层数组是相同的,而切片的len现在是3.

然而,如果我再次附加到该切片(numSlice = append(numSlice, 20)),切片的底层数组必须改变——我们看到,当numSlice的cap现在翻了一番,len现在是4时,情况就是这样.

很抱歉解释得太繁琐了,我只是简单介绍一下,但是有人能向我解释一下底层数组在幕后发生了什么,以及如何获得对新数组的引用吗?

推荐答案

首先,如果你还没有读过,你应该读this official blog post about slice internals.这应该会把一切都弄清楚.

现在,要访问底层数组,您可以使用reflectunsafe的组合.具体地,reflect.SliceHeader包含Data字段,该字段包含指向切片的底层数组的指针.

根据unsafe包装的文件改编的示例:

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

Go相关问答推荐

如何使用Promela建模语言对Golang RWLock进行建模

Go Regexp:匹配完整的单词或子字符串,或者根本不匹配

在Mac中使用uname获取处理器体系 struct 时,在为AMD64构建Go二进制时出现错误结果

Go中的net.SplitHostPort(r.RemoteAddr)安全性

如何在S汇编器中更高效地将全局数据加载到霓虹灯寄存器?

什么东西逃到了堆里?

从带有嵌套括号的字符串中提取值

以编程方式取消 pyspark dataproc 批处理作业(job)

通过多阶段构建复制到 Docker 容器中时找不到文件

为什么不同的 Wireguard 私钥会产生相同的公钥?

Golang 通过接口反映/迭代{}

从数据库中带有 imageurl 的文件夹中获取图像,并在我的浏览器中用 golang 中的 echo 显示

Go 中的 HTTP 请求验证中间件

为什么此代码在运行命令 error="exec: not started" 时出现错误?

此代码如何生成内存对齐切片?

如何在测试中使用自定义标志(使用`testify/suite`)

如何在Go中替换符号并使下一个字母大写

如何获取多个 url 参数值

如何使用 httputil.ReverseProxy 设置 X-Forwarded-For

有没有办法在golang中映射一组对象?