请参阅以下代码
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.
我想这会浪费在记忆上。 我对静态编程语言完全不熟悉,所以如果这篇文章中有任何错误的概念,请指出。
答案 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个元素。