有没有更好的方法来处理可变大小的片段?

时间:2014-09-16 11:03:44

标签: arrays go slice

请参阅以下代码

names := make([]string, 0, 100)
names = append(names, "Jack")
names = append(names, "Jacob")
// adding many names in here

考虑到这样的情况:我会从其他地方获取这些名字,之前我不知道它的大小。所以我需要一个包含这些名称的动态数组。上面的代码是我提出的方式。我很想知道是否有更优雅的方法来做到这一点。

如果我这样初始化

names := make([]string, 100, 200)
// then I use append in here
// I would get first 100 elements as empty, the append start at index 101.

我想这会浪费在记忆上。 我对静态编程语言完全不熟悉,所以如果这篇文章中有任何错误的概念,请指出。

3 个答案:

答案 0 :(得分:7)

只是声明类型,然后将附加的切片分配给它:

package main

import "fmt"

func main() {
    var names []string
    names = append(names, "foo")
    names = append(names, "bar")
    fmt.Println(names)
}

收率:

>> [foo bar]

如果你正在使用它的机制,这里有一个很好的blog post

答案 1 :(得分:2)

坚持你正在做的事情。 100不会阻止切片拥有更多的100个元素

names := make([]string, 0, 100)
names = append(names, "Jack")
names = append(names, "Jacob")

如果您粗略估计元素数量并且总是使用追加来向切片添加元素,我强烈建议设置切片的容量。您不必担心超出您的估计值,因为追加将创建新阵列以适应添加的元素。

names := make([]string)

上面的情况你的数组有0容量,append会导致底层数组一次又一次地被创建。这将对性能产生影响。你应该避免这种情况。如果您担心占用内存中的更多空间,可以考虑创建指向类型

的指针切片
objList := make([]*MyStructType, 0, 100)

答案 2 :(得分:0)

您可以考虑设置初始长度,而不是' 0',以及您的容量(100,意味着最多可以添加100个元素)。

请参阅" Arrays, slices (and strings): The mechanics of 'append'"

  

分配。

     

我们可以使用新的内置函数来分配更大的数组,然后对结果进行切片,但是使用make内置函数更简单。
  它分配一个新数组并创建一个切片头来同时描述它。 make函数有三个参数:切片的类型,它的初始长度和容量,它是分配用于保存切片数据的数组的长度

我们的想法是避免append()过早增长切片,特别是如果你知道你会收到至少n个元素。