在GoLang中构建空数组的最佳实践?

时间:2017-07-26 03:46:09

标签: go initialization

我在初始化空数组时想知道最佳做法。

  

即。 arr1,arr2和arr3之间有什么区别吗?

myArr1 := []int{}
myArr2 := make([]int,0)
var myArr3 []int

我知道他们制作空[]int但是我想知道,一种语法比其他语法更好吗?就个人而言,我发现第一个最具可读性,但与此不同。争用的一个关键点可能是阵列容量,可能是默认容量在三者之间是相同的,因为它未指定。宣布未指定容量的阵列"坏"?我可以假设它带来了一些性能成本,但是如何"糟糕"真的吗?

  

/ tldr

  1. 3种方法之间有什么区别 阵列?
  2. 未指定时数组的默认容量是多少?
  3. 使用未指定容量的阵列的性能成本是多少?

3 个答案:

答案 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中的数组和切片非常不同,数组具有固定大小,属于该类型的一部分。起初我也遇到了麻烦:)

  1. 不是。如果这三个是正确的,任何差异都应该太小而不用担心。在我自己的代码中,我通常使用在特定情况下最简单的东西。
  2. 0
  3. 没有,直到你需要添加一个项目,然后分配所需的存储成本。

答案 2 :(得分:2)

  

制作空数组的3种方法之间有什么区别吗?

如果empty array表示len(array)==0,则答案为否,但实际上只有myArr3==niltrue

  

未指定时数组的默认容量是多少?

默认容量与您指定的len相同。

  

使用具有未指定容量的阵列的性能成本是多少?