Go: Массивы

Массив — это коллекция однотипных значений фиксированной длины:

nums := [5]int{}

Длина массива указывается в квадратных скобках. Если не заполнить массив при инициализации, то массив будет состоять из нулевых значений данного типа:

nums := [5]int{} // [0, 0, 0, 0, 0]

// длинная инициализация
var nums [5]int // [0, 0, 0, 0, 0]

При попытке инициализации элементов за границей массива выходит ошибка компиляции:

nums := [1]int{1, 2} // array index 1 out of bounds [0:1]

Чтение и запись элементов массива происходит через квадратные скобки:

nums := [3]int{1, 2, 3}

fmt.Println(nums[1]) // 2

nums[2] = 33

fmt.Println(nums) // [1, 2, 33]

Нумерация элементов массива начинается с 0. При попытке чтения/записи элементов за границей массива выходит ошибка компиляции:

words := [2]string{}

words[2] // invalid array index 2 (out of bounds for 2-element array)

Массивы в Go передаются по значению, следовательно, любое изменение внутри функции не влияет на исходный массив:

package main

import (
	"fmt"
)

func main() {
	a := [3]int{1, 2, 3}

	modifyArr(a)

	fmt.Println(a) // 1, 2, 3
}

func modifyArr(nums [3]int) {
	nums[0] = 35
}

В Go есть встроенная функция len(), которая возвращает длину массива:

fmt.Println(len([5]int{1, 2, 3})) // 5
fmt.Println(len([10]int{}))       // 10

Так как массивы инициализируются с фиксированной длинной, то функция len() всегда возвращает одно и то же значение.

Задание

Реализуйте функцию SafeWrite(nums [5]int, i, val int) [5]int, которая записывает значение val в массив nums по индексу i, если индекс находится в рамках массива. В противном случае массив возвращается без изменения.

Как с вами связаться? 🙃

Команда проекта находится в телеграм-сообществе по ссылке https://ttttt.me/HexletLearningBot. Там можно задать любой вопрос и повлиять на проект

Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник". Как правильно задать вопрос:

В моей среде код работает, а здесь нет 🤨

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя 🤔

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно 🙄

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются

Привет! Я Тота и моя задача помочь в обучении. Чтобы активировать меня, нужно зарегистрироваться или залогиниться, если у вас уже есть аккаунт

Loading...

Ваше упражнение проверяется по этим тестам

1package solution
2
3import (
4	"testing"
5
6	"github.com/stretchr/testify/assert"
7)
8
9func TestSafeWrite(t *testing.T) {
10	a := assert.New(t)
11	a.Equal([5]int{}, SafeWrite([5]int{}, -1, 10))
12	a.Equal([5]int{}, SafeWrite([5]int{}, -10, 10))
13	a.Equal([5]int{}, SafeWrite([5]int{}, 10, 10))
14	a.Equal([5]int{}, SafeWrite([5]int{}, 20, 10))
15	a.Equal([5]int{}, SafeWrite([5]int{}, 5, 10))
16	a.Equal([5]int{10, 2, 3, 4, 5}, SafeWrite([5]int{1, 2, 3, 4, 5}, 0, 10))
17	a.Equal([5]int{1, 2, 10, 4, 5}, SafeWrite([5]int{1, 2, 3, 4, 5}, 2, 10))
18	a.Equal([5]int{1, 2, 3, 4, 22}, SafeWrite([5]int{1, 2, 3, 4, 5}, 4, 22))
19}
20

Решение учителя откроется через:

20:00
waiting_clock