我在初始化空数组时想知道最佳做法。
即。 arr1,arr2和arr3之间有什么区别吗?
myArr1 := []int{}
myArr2 := make([]int,0)
var myArr3 []int
我知道他们制作空[]int
但是我想知道,一种语法比其他语法更好吗?就个人而言,我发现第一个最具可读性,但与此不同。争用的一个关键点可能是阵列容量,可能是默认容量在三者之间是相同的,因为它未指定。宣布未指定容量的阵列"坏"?我可以假设它带来了一些性能成本,但是如何"糟糕"真的吗?
/ tldr
答案 0 :(得分:3)
使用具有未指定容量的阵列的性能成本是多少?
开始填充切片时肯定会有成本。如果你知道切片应该增长多大,你可以从非常乞讨中分配底层数组的容量,而不是每次基础数组填满时重新分配。
这是一个简单的时间示例:
package main
import "fmt"
func main() {
limit := 500 * 1000 * 1000
mySlice := make([]int, 0, limit) //vs mySlice := make([]int, 0)
for i := 0; i < limit; i++ {
mySlice = append(mySlice, i)
}
fmt.Println(len(mySlice))
}
在我的机器上:
time go run my_file.go
预先分配:
real 0m2.129s
user 0m2.073s
sys 0m1.357s
没有预分配
real 0m7.673s
user 0m9.095s
sys 0m3.462s
答案 1 :(得分:2)
首先,它是一个切片而不是一个数组。 Go中的数组和切片非常不同,数组具有固定大小,属于该类型的一部分。起初我也遇到了麻烦:)
答案 2 :(得分:2)
制作空数组的3种方法之间有什么区别吗?
如果empty array
表示len(array)==0
,则答案为否,但实际上只有myArr3==nil
为true
。
未指定时数组的默认容量是多少?
默认容量与您指定的len相同。
使用具有未指定容量的阵列的性能成本是多少?
无