Answers:
除了fabriziom的答案外,您还可以在“ 转到切片:用法和内部方法 ”中看到更多示例,其中[]int
提到了的用法:
由于slice(
nil
)的零值就像一个零长度的slice一样,您可以声明一个slice变量,然后在循环中附加到它:
// Filter returns a new slice holding only
// the elements of s that satisfy f()
func Filter(s []int, fn func(int) bool) []int {
var p []int // == nil
for _, v := range s {
if fn(v) {
p = append(p, v)
}
}
return p
}
这意味着,要附加到切片,您不必先分配内存:nil
切片p int[]
足以作为要添加的切片。
var p []int
比使用起来容易make
(我将其与分配相关联,即使上限为0,也不会分配任何内容)。在可读性方面,我宁愿不在make
这里使用。
p := []int{}
)。由于我们通常使用:=
语法来声明大多数变量,因此将其随处可见而不是对切片有异常是更自然的。除此之外,尝试考虑分配通常会促使人们进行过早的优化。
简单声明
var s []int
不分配内存并s
指向nil
,而
s := make([]int, 0)
分配内存并将s
内存指向具有0个元素的切片。
通常,如果您不知道用例的确切大小,第一个更惯用。
make
映射,因为即使是空的也map
需要分配一些簿记空间。
nil
在您的slice没有任何元素(而不是空数组)的情况下,将使用声明性形式返回。但是,如果make
用于创建切片,则将返回一个空数组,这通常是所需的效果。
var s []int
)将产生null
,而封送空切片(s := make([]int, 0)
)将产生预期的[]
更加完整的make
示例(中有一个参数):
slice := make([]int, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
出:
length: 2 - capacity 5 - content: [0 0]
或具有动态类型slice
:
slice := make([]interface{}, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
出:
length: 2 - capacity 5 - content: [<nil> <nil>]
nil
切片,而第二个创建一个empty
切片(这是“行动指南”中使用的术语)。为了避免在此处也发布相同的答案,您可以检查stackoverflow.com/a/45997533/1561148