Как создать массив / фрагмент с 5 значениями, все одинаковые значения - PullRequest
0 голосов
/ 17 декабря 2018

Задача

На языке программирования go, как создать массив длиной 5 со всеми элементами, имеющими одинаковое значение, например, 42.

Порядок предпочтений

удобочитаемость, лаконичность, производительность.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Лучший способ сделать это - использовать срез для этого, поскольку он может расти динамически.

В настоящее время вы ищете только значения 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]
}
0 голосов
/ 17 декабря 2018

Например,

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...