登录
首页 >  Golang >  Go问答

Go 没有真正的方法来缩小切片吗?这是一个问题吗?

来源:Golang技术栈

时间:2023-03-28 11:12:29 229浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《Go 没有真正的方法来缩小切片吗?这是一个问题吗?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下golang,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

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

package main

import (
    "math"
    "fmt"
)

func main() {
    var a []int64
    var i int64;
    upto := int64(math.Pow10(7))
    for i = 0; i 

但后来我决定我不想要其中的大多数,所以我想最终只得到其中的 10 个。我[在 Go 的 wiki 上尝试了切片和删除技术,](https://code.google.com/p/go- wiki/wiki/SliceTricks)但似乎都没有降低切片的容量。

所以这就是我的问题:Go 是否没有真正的方法来缩小切片的容量,这类似于realloc()-ing 的大小参数比您之前在 C 中对同一指针的调用中更小?这是一个问题,应该如何处理?

正确答案

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

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

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

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

编辑:以上只是部分正确。在一般情况下,编译器 不能 推导是否有其他指向切片支持数组的指针。因此 realloc 不适用。上面的代码片段实际上 保证 执行“newSize”元素的副本。对于可能造成的任何混乱,我们深表歉意。

到这里,我们也就讲完了《Go 没有真正的方法来缩小切片吗?这是一个问题吗?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于golang的知识点!

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