From 794e65897e31558c79d984c76ad7305a8fbf7875 Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Tue, 20 Feb 2024 15:22:06 +0500 Subject: [PATCH] add more examples --- drafts/.gitkeep | 0 .../20-for-loop/description.ru.yml | 95 ------------------- .../20-for-loop/ru/README.md | 45 +++++++-- 3 files changed, 39 insertions(+), 101 deletions(-) delete mode 100755 drafts/.gitkeep delete mode 100644 modules/20-array-slice-map/20-for-loop/description.ru.yml diff --git a/drafts/.gitkeep b/drafts/.gitkeep deleted file mode 100755 index e69de29..0000000 diff --git a/modules/20-array-slice-map/20-for-loop/description.ru.yml b/modules/20-array-slice-map/20-for-loop/description.ru.yml deleted file mode 100644 index 95a5bcb..0000000 --- a/modules/20-array-slice-map/20-for-loop/description.ru.yml +++ /dev/null @@ -1,95 +0,0 @@ ---- - -name: Цикл for -theory: | - - Из-за стремления создателей Go к простоте и однозначности обход коллекций осуществляется только через цикл `for`. Условное выражение пишется без скобок и тело цикла всегда должно быть внутри `{ }`: - - ```go - nums := make([]int, 0, 10) - - // начиная с 0; пока i меньше 10; инкрементим i после каждого шага - for i := 0; i < 10; i++ { - nums = append(nums, i) - } - - fmt.Println(nums) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] - ``` - - При необходимости `for` используется как цикл `while` в других языках: - - ```go - i := 0 - nums := make([]int, 0, 10) - - for i < 10 { - nums = append(nums, i) - i++ - } - - fmt.Println(nums) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] - ``` - - Если опустить условное выражение, можно уйти в бесконечный цикл: - - ```go - i := 0 - - nums := make([]int, 0, 10) - - for { - if i == 10 { - break - } - - nums = append(nums, i) - i++ - } - - fmt.Println(nums) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] - ``` - - Если условное выражение возвращает `false` или был вызван `break` в теле, то происходит остановка цикла. Перейти на следующую итерацию можно с помощью ключевого слова `continue`: - - ```go - nums := make([]int, 0, 10) - - // добавляем только четные числа в слайс - for i := 0; i < 10; i++ { - if i % 2 != 0 { - continue - } - - nums = append(nums, i) - } - - fmt.Println(nums) // [0 2 4 6 8] - ``` - - Для обхода коллекции в Go есть "синтаксический сахар" `range`. Эта конструкция обходит слайс, возвращая индекс и элемент на каждом шаге: - - ```go - names := []string{"John", "Harold", "Vince"} - - // i — это индекс, name — это значение на текущем шаге цикла - for i, name := range names { - fmt.Println("Hello ", name, " at index ", i) - } - ``` - - Вывод: - - ```go - Hello John at index 0 - Hello Harold at index 1 - Hello Vince at index 2 - ``` - - -instructions: | - - Реализуйте функцию `func Map(strs []string, mapFunc func(s string) string) []string`, которая преобразует каждый элемент слайса `strs` с помощью функции `mapFunc` и возвращает новый слайс. Учтите, что исходный слайс, который передается как `strs`, не должен измениться в процессе выполнения. - -tips: - - | - [The Go Programming Language Specification — For statement](https://golang.org/ref/spec#For_statements) diff --git a/modules/20-array-slice-map/20-for-loop/ru/README.md b/modules/20-array-slice-map/20-for-loop/ru/README.md index a019217..70d4b23 100644 --- a/modules/20-array-slice-map/20-for-loop/ru/README.md +++ b/modules/20-array-slice-map/20-for-loop/ru/README.md @@ -62,21 +62,54 @@ for i := 0; i < 10; i++ { fmt.Println(nums) // [0 2 4 6 8] ``` -Для обхода коллекции в Go есть "синтаксический сахар" `range`. Эта конструкция обходит слайс, возвращая индекс и элемент на каждом шаге: +Для обхода коллекции в Go есть "синтаксический сахар" `range`. Эта конструкция обходит слайс, возвращая пару - индекс и элемент на каждом шаге: ```go names := []string{"John", "Harold", "Vince"} // i — это индекс, name — это значение на текущем шаге цикла for i, name := range names { - fmt.Println("Hello ", name, " at index ", i) + fmt.Println("Hello ", name, " at index ", i) } + +// => Hello John at index 0 +// => Hello Harold at index 1 +// => Hello Vince at index 2 +``` + +Если пропустить вторую переменную, то получим только индексы: + +```go +for i := range names { + fmt.Println("index = ", i) +} + +// => index = 0 +// => index = 1 +// => index = 2 +``` + +Можно пропустить первую переменную, это можно сделать с помощью `_`: + +```go +for _, name := range names { + fmt.Println("Hello ", name) +} + +// => Hello John +// => Hello Harold +// => Hello Vince ``` -Вывод: +Пропуск сразу двух переменных не сработает. На этапе компиляции произойдет ошибка: ```go -Hello John at index 0 -Hello Harold at index 1 -Hello Vince at index 2 +for _,_ := range names { + fmt.Println("Nothing") +} +``` + +```text +# command-line-arguments +./main.go:21:14: no new variables on left side of := ```