问题
在go编程语言中,如何创建长度为5的数组,所有元素的值都相同,例如42。
偏好顺序
可读性,简洁性,性能。
答案 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]
}