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

Go真的没有缩小片段的方法吗?那是个问题吗?

麻宜春
2023-03-14
问题内容

我已经尝试Go了一段时间,这个问题一直困扰着我。假设我在一个切片中建立了一个相当大的数据集(例如,一千万个int64)。

package main

import (
    "math"
    "fmt"
)

func main() {
    var a []int64
    var i int64;
    upto := int64(math.Pow10(7))
    for i = 0; i < upto; i++ {
        a = append(a, i)
    }
    fmt.Println(cap(a))
}

但是后来我决定我不想要其中的大多数,因此我只想得到其中的十个。我已经在Go的Wiki上尝试了切片和删除技术,但它们似乎都没有减少切片的容量。

因此,这就是我的问题:realloc()与在C中对同一指针的先前调用相比,Go是否具有缩小-sing大小参数的实际方法?这是一个问题,应该如何处理?


问题答案:

实际上执行切片的重新分配:

a = append([]T(nil), a[:newSize]...) // Thanks to @Dijkstra for pointing out the missing ellipsis.

如果它确实将newSize元素复制到新的内存位置,或者是否像realloc(3)一样进行实际
大小调整,则由编译器完全决定。您可能想调查当前的状态,如果还有改进的余地,也许会提出一个问题。

但是,这可能是微优化。性能增强的第一个来源几乎总是在于选择更好的算法和/或更好的数据结构。使用巨大的向量最终只保留一些项可能不是内存消耗的最佳选择。

编辑:以上只是部分正确。在一般情况下,编译器 无法 导出是否有其他指向切片支持数组的指针。因此,重新分配不适用。上面的代码段实际上可以 保证 执行“
newSize”元素的副本。抱歉造成任何混乱。



 类似资料:
  • 问题内容: 在Java中,访问修饰符被认为是安全的,因为它在类外部不可见。然后外面的世界也不知道这种方法。 但是我认为Java反射可以用来打破这一规则。考虑以下情况: 现在从另一堂课我将获得信息: 这时我只是觉得私有方法仍然安全,因为要做上面的事情我们必须知道方法名称。但是,如果类包含由其他人编写的私有方法,那么我们将看不到那些。 但是,由于下面的代码行,我的观点变得无效。 现在,它包含了需要做的

  • 问题内容: 您推荐哪种JavaScript压缩程序? 问题答案: UglifyJS2,由jQuery项目使用。

  • 我目前正在研究字符串concat选项,以及它们对整体性能的影响。我的测试用例产生了让我震惊的结果,我不确定我是否忽略了什么。 这里是交易:在java中执行将(在编译时)创建一个新的。 对于我的测试用例,我正在从我的硬盘加载一个文件,其中包含1661行示例数据(经典的“Lorem Ipsum”)。这个问题不是关于I/O性能,而是关于不同字符串concat方法的性能。 如您所见,两个测试的设置是相同的

  • Android开发人员指南有一个不错的部分是关于片段的使用。使用片段的一种方法是没有UI。有几个参考使用这作为一种背景处理的手段,但碎片给这一领域带来了什么好处?我会选择在线程、AsyncTasks、处理程序等上使用片段进行后台处理?

  • 我开发了一个应用程序,其中有导航抽屉和抽屉内的许多片段,所以我在打开片段内的片段时遇到问题,在一个片段中,当用户单击列表视图项时,我有列表视图,他们获得了与列表项相关的数据,所以我面临的问题是,它仍然单击不可见的列表,但单击 片段布局 开放片段代码

  • 本文向大家介绍移动端图片上传旋转、压缩问题的方法,包括了移动端图片上传旋转、压缩问题的方法的使用技巧和注意事项,需要的朋友参考一下 前言 在手机上通过网页 input 标签拍照上传图片,有一些手机会出现图片旋转了90度d的问题,包括 iPhone 和个别三星手机。这些手机竖着拍的时候才会出现这种问题,横拍出来的照片就正常显示。因此,可以通过获取手机拍照角度来对照片进行旋转,从而解决这个问题。 Or