我开始学习GO语言,但我不太了解某些内容,也许我只是感到困惑和疲倦。 这是我的代码,有一个结果数组(来自编码字符串,大小2139614元素)。我需要解码它们并进一步使用它们。但是,当我运行一次迭代时,结果片段是原来的两倍,而上半部分完全是空的。因此,我将切片并添加到所需的范围。
为什么会这样?
立即解码结果并重新记录可能会更容易,但是我不知道该怎么做)))
也许有完全不同的方式,作为一个初学者,我还不知道
result := []string{}
for i, _ := range input {
result = append(result, i)
}
sort.Strings(result)
rips := make([][]byte, 2139614)
for _, i := range result {
c := Decode(i)
c = c[1:37]
rips = append(rips, c)
}
//len(result) == 2139614
for i := 2139610; i < 2139700; i++ {
fmt.Println(i, rips[i])
}
resultrips := rips[2139614:]
for _,i := range resultrips {
fmt.Println(i)
}
fmt.Println("All write: ", len(resultrips))
和这个问题:如果我需要一个字节数组数组,我就做对了(我这样做是为了不做太多工作,并且将检查字节值,因为没有任何编码)。 / p>
rips := make([][]byte, 2139614)
//数组[] byte
最后,我需要使用C ++中的集合类型的数组来检查集合中是否有元素
在C ++中是代码:
if (resultrips.count > 0) { ... }
答案 0 :(得分:2)
写时:
make([][]byte, 2139614)
这将创建一个切片,切片的长度为,的容量等于2139614
。当您append
切片时,它总是附加在最后一个元素之后,从而增加了长度。如果要预分配一个较大的切片以便可以附加到其中,则需要指定长度0
:
make([][]byte, 0, 2139614)
这会预先分配2139614个元素,但是长度为0
,随后的append
调用将从切片的开始开始;在第一次追加之后,其长度为1
,并且不需要增加其容量。
行程之行涵盖了长度与容量的关系:https://tour.golang.org/moretypes/13
基于问题文本的快速注释-请记住,切片和数组不是同一件事。数组具有编译时固定长度,其容量与长度是同义词。切片由数组支持,但具有与运行时动态无关的长度和容量。