Можно ли инициализировать срез с определенными значениями?

#go #slice

#Вперед #срез

Вопрос:

Можно ли инициализировать фрагмент со всеми 1, как в python?

PYTHON:

 onesArray = np.ones(5)
onesList = [1]*5
  

GOLANG

 onesSlice := make([]int, 5)
for i:= 0; i < len(onesSlice); i  {
    onesSlice[i] = 1
}
  

Можно ли сделать лучше, чем это?

Ответ №1:

Да, но вы должны использовать другой синтаксис.

 oneSlice := []int{1, 1, 1, 1, 1}
  

Это называется «составной литерал»

Кроме того, если есть причина для повторения (например, вычисления переменной цикла на основе значений или чего-то еще), вы можете использовать range ключевое слово, а не старую школу, для i равно, i меньше, чем, i цикл.

 for i := range onesSlice {
    onesSlice[i] = 1
}
  

Комментарии:

1. len(oneSlice) == cap(oneSlice)

2. Я хочу создать фрагмент, содержащий n копии integer val . Есть ли более простой способ, чем цикл? Например, на C я могу сделать vector<int> a(n, val) .

3. Начиная с 1.16, в Go нет простого способа. Было бы неплохо, если бы вы могли написать, например make_init([]int, N, INIT_VAL) , могли бы создать фрагмент N раз INIT_VAL (с емкостью N).