如何创建5个值都相同的数组/切片

时间:2018-12-17 02:13:09

标签: arrays go

问题

在go编程语言中,如何创建长度为5的数组,所有元素的值都相同,例如42。

偏好顺序

可读性,简洁性,性能。

2 个答案:

答案 0 :(得分:2)

例如,

package main

import (
    "fmt"
)

func main() {
    s := make([]int, 5)
    for i := range s {
        s[i] = 42
    }
    fmt.Println(len(s), s)
}

游乐场:https://play.golang.org/p/GjTXruMsJ5h

输出:

5 [42 42 42 42 42]

一些基准:

package main

import (
    "fmt"
    "testing"
)

func BenchmarkStack(b *testing.B) {
    for N := 0; N < b.N; N++ {
        s := make([]int, 5)
        for i := range s {
            s[i] = 42
        }
    }
}

func BenchmarkHeap(b *testing.B) {
    var s []int
    for N := 0; N < b.N; N++ {
        s = make([]int, 5)
        for i := range s {
            s[i] = 42
        }
    }
}

func BenchmarkHygull(b *testing.B) {
    for N := 0; N < b.N; N++ {
        var s []int
        for i := 0; i < 5; i++ {
            s = append(s, 42)
        }
    }
}

输出:

$ go test slice42_test.go -bench=. -benchmem
BenchmarkStack-8     1000000000      2.05 ns/op     0 B/op    0 allocs/op
BenchmarkHeap-8       100000000     26.9 ns/op     48 B/op    1 allocs/op
BenchmarkHygull-8      10000000    123 ns/op      120 B/op    4 allocs/op
$ 

BenchmarkHygull演示了@hygull解决方案的效率低下。


“单线”:

package main

import (
    "fmt"
)

func newInts(n, v int) []int {
    s := make([]int, n)
    for i := range s {
        s[i] = v
    }
    return s
}

func main() {
    s := newInts(5, 42)
    fmt.Println(len(s), s)
}

游乐场:https://play.golang.org/p/t8J-AjYQ72l

输出:

5 [42 42 42 42 42]

答案 1 :(得分:1)

最好的方法是使用slice,因为它可以动态增长。

当前,您只在寻找 5 值,因此使用数组也不是问题,但是如果您正在寻找动态大小(即,如果在运行时指定数组大小,则可能会出现问题)可能超出范围或未使用所有分配的空间)。

因此,我认为以下代码足以理解这一点。

package main  
import "fmt" 

func main() { 
    var s []int
    value := 42 // It can be changed to other values 

    for i := 0; i < 5; i++ {
        s = append(s, value)
    }

    fmt.Println(s); // [42 42 42 42 42]
}