如何同时用初始值和容量初始化slice?

问题描述 投票:0回答:1

部分代码如下:

const ESTIMATEDSIZE = 10000
var init_arr = [...]int{1,1,2,3,5,8,13}
var fibbo []int = make([]int, len(init_arr), ESTIMATEDSIZE)    
}

在c++中没有像

reserved
那样的
vector
函数,用于切片
fibbo
为切片保留
ESTIMATEDSIZE
以减少扩展容量的复制时间。所以我只能在初始化时将 ESTIMATEDSIZE 分配给容量。但以下都不合法。

var fibbo []int = init_arr[::ESTIMATEDSIZE]
var fibbo []int = make([]int{1,1,2,3,5,8,13}, len(init_arr), ESTIMATEDSIZE)

这道题有什么方法吗?或者可能是笨拙的代码如下是唯一的方法?

var fibbo []int = make([]int, len(init_arr), ESTIMATEDSIZE) 
for i:= range init_arr {
    fibbo[i] = init_arr[i]
}
go slice capacity
1个回答
0
投票

不,这是不可能的。这是 Go 设计理念的一部分,它为这个设计决策提供了信息:“不要隐藏复杂性。”

您的“笨拙”代码实际上是在 Go 中执行此操作的首选和惯用方式,只需一个小改动:

var fibbo = make([]int, len(init_arr), ESTIMATEDSIZE) 
for i := range init_arr {
    fibbo[i] = init_arr[i]
}

(除了格式化),我所做的唯一更改是从

var
声明中删除类型,因为这完全是多余的。换句话说:

-var fibbo []int = make([]int, len(init_arr), ESTIMATEDSIZE) 
+var fibbo = make([]int, len(init_arr), ESTIMATEDSIZE) 
© www.soinside.com 2019 - 2024. All rights reserved.