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

qea*_*tzy 1 arrays go

问题

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

优先顺序

可读性、简洁性、性能。

pet*_*rSO 7

例如,

package main

import (
    "fmt"
)

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

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

输出:

5 [42 42 42 42 42]
Run Code Online (Sandbox Code Playgroud)

一些基准:

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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ 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
$ 
Run Code Online (Sandbox Code Playgroud)

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)
}
Run Code Online (Sandbox Code Playgroud)

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

输出:

5 [42 42 42 42 42]
Run Code Online (Sandbox Code Playgroud)