Курсы Разработчик Golang
Команды
- go run main.go - запускает код без компиляции
- go test - запускает созданные ранее тесты
- go mod init - инициализирует модули
- go mod tidy - избавиться от неиспользуемых зависимостей
- go vet - анализирует код на предмет ошибок
- golint - поиск простых ошибок и некорректного оформления
- gofmt -w -s -d . - приводит написанный код к общему стилю ("-w" - записать, "-d" - вывести diff)
- go build - компилирует код в бинарный файл
- go clean -cache -modcache -i -r -n - очистить кэш
- go test -coverprofile=c.out && go tool cover -html=c.out
Homework 1. Time
gettime:
- программа печатающая текущее время / точное время с использованием библиотеки NTP
Homework 2. Unpack
unpacker - Распаковка строки:
Цель: Создать Go функцию, осуществляющую примитивную распаковку строки, содержащую повторяющиеся символы / руны, например:
a4bc2d5e
=>aaaabccddddde
abcd
=>abcd
45
=> `` (некорректная строка)=>
Дополнительное задание: поддержка escape - последовательностей
qwe\4\5
=>qwe45
(*)qwe\45
=>qwe44444
(*)qwe\\5
=>qwe\\\\\
(*)
В случае если была передана некорректная строка функция должна возвращать ошибку.
Завести в репозитории отдельный пакет (модуль) для этого ДЗ
Реализовать функцию вида Unpack(string) (string, error)
При необходимости выделить вспомогательные функции
Написать unit-тесты на функцию
Критерии оценки: Функция должна проходить все тесты
Код должен проходить проверки go vet и golint
У преподавателя должна быть возможность скачать и проверить пакет с помощью go get / go test
Задание (*) НЕ влияет на баллы, оно дано просто для развития навыков.
Homework 3. Top10
topwords - функция "Top10" Выводить 10 частовстречающихся фраз в тексте
Частотный анализ Цель: Написать функцию, принимающую на вход строку с текстом и возвращающую слайс с 10 самыми часто встречающихся в тексте словами. Если есть более 10 самых частотных слов (например 15 разных слов встречаются ровно 133 раза, остальные < 100), можно вернуть любые 10 из самых частотных. Словоформы не учитываем. "нога", "ногу", "ноги" - это разные слова. Слово с большой и маленькой буквы можно считать за разные слова. "Нога" и "нога" - это разные слова. Знаки препинания можно считать "буквами" слова или отдельными словами. "-" (тире) - это отдельное слово. "нога," и "нога" - это разные слова. Пример: "cat and dog one dog two cats and one man". "dog", "one", "and" - встречаются два раза, это топ-3. Задание со звездочкой (): учитывать большие/маленькие буквы и знаки препинания. "Нога" и "нога" - это одинаковые слова, "нога," и "нога" - это одинаковые слова, "-" (тире) - это не слово. Завести в репозитории отдельный пакет (модуль) для этого ДЗ Реализовать функцию вид Top10(string) ([]string) При необходимости выделить вспомогательные функции Написать unit-тесты на функцию Критерии оценки: Функция должна проходить все тесты. Код должен проходить проверки go vet и golint У преподавателя должна быть возможность скачать и проверить пакет с помощью go get / go test Задание () НЕ влияет на баллы, оно дано просто для развития навыков.
Homework 4. MaxValue
sortmax - функция "GetMaxValue" находит максимальный элемент в слайсе
Поиск максимума Написать функцию находящую максимальный элемент в слайсе с произвольными элементами ([]interface{}) с использованием пользовательской функции-компаратора.
Homework 5. Интерфейсы
LogOtusEvent - функция реализует интерфейс OtusEvent
Функция логирования Otus
Задача: написать функцию логирования LogOtusEvent, на вход которой приходят события типа HwAccepted (домашняя работа принята) и HwSubmitted (студент отправил дз) для этого - спроектировать и реализовать интерфейс OtusEvent.
Для события HwAccepted мы хотим логирровать дату, айди и грейд, для HwSubmitter - дату, id и комментарий, например:
2019-01-01 submitted 3456 "please take a look at my homework"
2019-01-01 accepted 3456 4
type HwAccepted struct {
Id int
Grade int
}
type HwSubmitted struct {
Id int
Code string
Comment string
}
interface OtusEvent {
}
function LogOtusEvent(e OtusEvent, w io.Writer) {
}
Homework 6. Двусвязный список
- Цель: Реализовать двусвязный список: https://en.wikipedia.org/wiki/Doubly_linked_list
- Завести в репозитории отдельный пакет (модуль) для этого ДЗ Реализовать типы List и Item (см. ниже) и методы у них.
- Написать unit-тесты проверяющие работу всех методов.
Ожидаемые типы (псевдокод):
List // тип контейнер Len() // длинна списка First() // первый Item Last() // последний Item PushFront(v interface{}) // добавить значение в начало PushBack(v interface{}) // добавить значение в конец Remove(i Item) // удалить элемент
Item // элемент списка Value() interface{} // возвращает значение Next() *Item // следующий Item Prev() *Item // предыдущий
- Критерии оценки: Сложность всех операций должна быть O(1), т.е. не должно быть мест где осуществляется полный обход списка.
- Пакет должен проходить все тесты. Код должен проходить проверки go vet и golint
- У преподавателя должна быть возможность скачать и проверить пакет с помощью go get / go test
Homework 7-8. Параллельное исполнение
- Цель: Написать функцию для параллельного выполнения N заданий (т.е. в N параллельных горутинах).
- Функция должна останавливать свою работу если произошло M ошибок.
- Сигнатура функции: Run(task []func()error, N int, M int) error
Учесть что задания могут выполняться разное время. Длинна списка задач L = len(tasks) может быть больше или меньше N. Завести в репозитории отдельный пакет (модуль) для этого ДЗ. Реализовать функцию вида Run(task []func()error, N int, M int) error. При необходимости выделить вспомогательные функции. Написать unit-тесты на функцию, проверяющие, что если задачи работаю без ошибок, то выполняются все N Если в первых M задачах происходят ошибки, то всего выполнится не более N+M задач.
- Критерии оценки: После завершения работы функции (успешного или из-за превышения M) не должно оставаться работающих горутин.
- Функция должна проходить все тесты. Код должен проходить проверки go vet и golint.
- У преподавателя должна быть возможность скачать и проверить пакет с помощью go get / go test
Homework 9-11. Утилита копирования файлов
- Цель: Реализовать утилиту копирования файлов (см man dd). Выводить в консоль прогресс копирования. Настроить и запустить линтеры, создать Makefile для автоматизации тестирования и сборки. Должна быть возможность скачать протестировать и установить программу с помощью go get/test/install
Homework 12-13. Утилита envdir
- Цель: Реализовать утилиту envdir на Go.
- Эта утилита позволяет запускать программы получая переменные окружения из определенной директории. Пример использования:
go-envdir /path/to/env/dir some_prog
Если в директории /path/to/env/dir содержатся файлы
A_ENV
с содержимым123
B_VAR
с содержимымanother_val
- То программа
some_prog
должать быть запущена с переменными окруженияA_ENV=123 B_VAR=another_v