如何创建5个值都相同的数组/切片 [英] How to create an array/slice of 5 value, all of same value

查看:64
本文介绍了如何创建5个值都相同的数组/切片的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题

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

偏好顺序

可读性,简洁性,性能.

解决方案

例如,

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/GjTXruMsJ5

输出:

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]

Problem

In go programming language, how to create an array of length 5, with all elements has same value, eg, 42.

Preference order

readability, conciseness, performance.

解决方案

For example,

package main

import (
    "fmt"
)

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

Playground: https://play.golang.org/p/GjTXruMsJ5h

Output:

5 [42 42 42 42 42]


Some benchmarks:

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)
        }
    }
}

Output:

$ 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 demonstrates how inefficient @hygull's solution is.


A "one-liner":

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)
}

Playground: https://play.golang.org/p/t8J-AjYQ72l

Output:

5 [42 42 42 42 42]

这篇关于如何创建5个值都相同的数组/切片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆