Из-за стремления создателей Go к простоте и однозначности обход коллекций осуществляется только через цикл for
. Условное выражение пишется без скобок и тело цикла всегда должно быть внутри { }
:
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
в других языках:
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]
Если опустить условное выражение, можно уйти в бесконечный цикл:
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
:
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
. Эта конструкция обходит слайс, возвращая пару - индекс и элемент на каждом шаге:
names := []string{"John", "Harold", "Vince"}
// i — это индекс, name — это значение на текущем шаге цикла
for i, name := range names {
fmt.Println("Hello ", name, " at index ", i)
}
// => Hello John at index 0
// => Hello Harold at index 1
// => Hello Vince at index 2
Если пропустить вторую переменную, то получим только индексы:
for i := range names {
fmt.Println("index = ", i)
}
// => index = 0
// => index = 1
// => index = 2
Можно пропустить первую переменную, это можно сделать с помощью _
:
for _, name := range names {
fmt.Println("Hello ", name)
}
// => Hello John
// => Hello Harold
// => Hello Vince
Пропуск сразу двух переменных не сработает. На этапе компиляции произойдет ошибка:
for _,_ := range names {
fmt.Println("Nothing")
}
# command-line-arguments
./main.go:21:14: no new variables on left side of :=
Реализуйте функцию func Map(strs []string, mapFunc func(s string) string) []string
, которая преобразует каждый элемент слайса strs
с помощью функции mapFunc
и возвращает новый слайс. Учтите, что исходный слайс, который передается как strs
, не должен измениться в процессе выполнения.
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1package solution
2
3import (
4 "golang.org/x/text/cases"
5 "golang.org/x/text/language"
6 "strings"
7 "testing"
8
9 "github.com/stretchr/testify/assert"
10)
11
12func TestMap(t *testing.T) {
13 a := assert.New(t)
14 testMap(a, []string{"John", "Peter", "Fedor"}, []string{"john", "peter", "fedor"}, func(s string) string {
15 return cases.Title(language.English).String(s)
16 })
17 testMap(a, []string{"hello", "world"}, []string{"HELLO", "WORLD"}, func(s string) string {
18 return strings.ToLower(s)
19 })
20}
21
22func testMap(a *assert.Assertions, expected, input []string, mapFunc func(s string) string) {
23 inputCopy := make([]string, len(input))
24 copy(inputCopy, input)
25
26 a.Equal(expected, Map(input, mapFunc))
27 a.Equal(inputCopy, input) // check that the initial slice hasn't been modified.
28}
29
Решение учителя откроется через: