/golang

Primary LanguageGo

Курсы Разработчик 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