当前位置: 首页 > 面试题库 >

如何在Go中获取切片的基础数组?

易衡
2023-03-14
问题内容

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

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

然后我只抓了前两个项目

numSlice := nums[:2]

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

如果我随后附加到该slice(numSlice = append(numSlice, 10)),则基础数组(nums)现在为[1 2 10]cap两者的值均保持为3,因为切片的基础数组相同,并且切片的len现在为3。

但是,如果我再次追加到该片(numSlice = append(numSlice, 20)),则cap该片的基础数组必须更改-
我们看到的情况是,现在numSlice增加了一倍,而len现在是4。

很抱歉过度解释,只是一步一步地讲解,但是有人可以向我解释底层数组的幕后情况以及如何获得对新数组的引用吗?


问题答案:

首先,如果您还没有的话,应该阅读有关slice内部构件的官方博客文章。那应该清除一切。

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

改编自unsafe包装文档的示例:

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


 类似资料:
  • 问题内容: 我从CSV文件加载了一些机器学习数据。前两列是观察值,其余两列是要素。 目前,我执行以下操作: 它给出了类似的东西: 我想两个dataframes切片此数据框:包含列一个和和包含一个列,和。 不可能写这样的东西 我不确定最好的方法是什么。我需要吗? 顺便说一下,我发现数据帧索引非常不一致:允许,但不允许。另一方面,不允许,但允许。是否有实际原因?如果列是由Int索引的,这确实令人困惑,

  • 问题内容: 在Go中清除切片的适当方法是什么? 这是我在go论坛中找到的内容: 这样对吗? 为了澄清起见,清除了缓冲区,以便可以重用它。 一个示例是bytes包中的Buffer.Truncate函数。 请注意,Reset只是调用Truncate(0)。因此看来,在这种情况下,第70行将评估:b.buf = b.buf [0:0] http://golang.org/src/pkg/bytes/bu

  • 创建大小为的隐式数组,并创建一个隐式数组的浅副本,指向数组中的前7个元素。 考虑 创建不指向任何隐式数组的零长度切片。 创建长度为2的新隐式数组,并附加值和。slice()指向新的隐式数组,其中

  • 问题内容: mapArray是float32的2D切片。我对其进行了复制,因此 无需修改mapArray即可进行复制 。但是,事实并非如此。分配一个值进行修改。 这样做将使-1而不是其原始值。 如何制作切片的真实独立副本? 谢谢。 编辑: 问题答案: 2D切片是切片的切片。在您的函数中,您分配一个切片来容纳其他切片,然后为每个切片分配内存来容纳该行数据。要复制它,您需要复制所有这些数据行以及整个切

  • 我在Rust中有一个,我需要在接受切片的函数中使用它。如何从一个中获取一个切片,其中的切片有一个元素,而的切片有零个元素?

  • 问题内容: 因此,我找到了一些代码来帮助我开始使用Go(golang)进行反射,但是我很难获取基础值,因此我基本上可以从结构及其字段中创建a 。 最终,我想将结果设为,但是这个问题有点使我受阻。 我目前拥有的代码: 运行代码的输出: 据我了解,FirstName和LastName的输出是实际的reflect.Value对象,但对于字符串,value上的String()方法仅输出基础String。我