Как создать калькулятор на Goвне?
Нам потребуется:
• Goвно (для проверки установки введите в консоль —
• Любой редактор (да хоть блокнот)
• Проект с начальной структурой (создай папку и введи
• Открой созданный ранее проект в своём редакторе и напиши простой Hello, world для проверки (писать код будем в
Скомпилировалось? Отлично, теперь перейдём к решению задач!
Задача №1:
Создать простейший калькулятор в главной функции
Решение:
Тут ничего сложного нет, просто складываем заранее известные числа, используя структуру Хэллоуворлда
Скриншот решения
Задача №2:
Написать калькулятор с функциями — add (от англ. addition — сложение), sub (от англ. subtract — вычитание), mul (от англ. multiply — умножить/умножение), div (от англ. divide — делить/деление), который считает целочисленные значения (int)
Решение:
Создаем функции (вне функции main!) из условия задачи как main(), только для того, чтобы обозначить возврат значений из функции требуется указать тип возвращаемых данных (в нашем случае int) после скобок в которых указываются аргументы — () и перед открывающей фигурной скобкой — {. В результате таких махинаций получится
Заметили что здесь не так?🧐
Верно! Не хватает самих аргументов функции.
Добавим их и получится следующее:
Мы уже близко к концу решения задачи!
У нас есть сигнатуры функций, но все они без тела (кода, который находится между фигурными скобками)
Так как мы выполняем только одну операцию (сложения, деления и т.д.) у нас будет только одна строчка в теле функции
Ура! Осталось проверить эти функции на работоспособность, вызвав их из главной функции.
Вызываем функции таким образом:
Задача №3:
Разрешить пользователю вводить свои числа и выбирать необходимую ему операцию.
Решение:
позже
Нам потребуется:
• Goвно (для проверки установки введите в консоль —
go version) : пример• Любой редактор (да хоть блокнот)
• Проект с начальной структурой (создай папку и введи
go mod init <module>, где вместо <module> любая хуета) : как должно получиться• Открой созданный ранее проект в своём редакторе и напиши простой Hello, world для проверки (писать код будем в
cmd/calc/main.go попозже объясню почему) : пример (отличный сайт для примеров кстати советую)Скомпилировалось? Отлично, теперь перейдём к решению задач!
Задача №1:
Создать простейший калькулятор в главной функции
Решение:
Тут ничего сложного нет, просто складываем заранее известные числа, используя структуру Хэллоуворлда
Скриншот решения
Задача №2:
Написать калькулятор с функциями — add (от англ. addition — сложение), sub (от англ. subtract — вычитание), mul (от англ. multiply — умножить/умножение), div (от англ. divide — делить/деление), который считает целочисленные значения (int)
Решение:
Создаем функции (вне функции main!) из условия задачи как main(), только для того, чтобы обозначить возврат значений из функции требуется указать тип возвращаемых данных (в нашем случае int) после скобок в которых указываются аргументы — () и перед открывающей фигурной скобкой — {. В результате таких махинаций получится
func add() int {} — функция add, которая возвращает целочисленное значение. Точно также проделаем с остальными функциями.Заметили что здесь не так?
Верно! Не хватает самих аргументов функции.
Добавим их и получится следующее:
func add(a int, b int) int {} — функция add, которая принимает числа a и b как аргументы и возвращает целочисленное значение. Добавим аргументы остальным функциям.Мы уже близко к концу решения задачи!
У нас есть сигнатуры функций, но все они без тела (кода, который находится между фигурными скобками)
Так как мы выполняем только одну операцию (сложения, деления и т.д.) у нас будет только одна строчка в теле функции
return a + b — возврат результата сложения переданных аргументов функции a и b. Осталось сделать тоже самое для других функций, но заменив знак сложения на другой (- для вычитания, * для умножения и т.д.).Ура! Осталось проверить эти функции на работоспособность, вызвав их из главной функции.
Вызываем функции таким образом:
add(1, 0), sub(10, 2).Задача №3:
Разрешить пользователю вводить свои числа и выбирать необходимую ему операцию.
Решение:
позже
Please open Telegram to view this post
VIEW IN TELEGRAM
Основные структуры данных в Go
Разберём основные структуры данных в Go и реализуем их, а также порешаем задачки
Всё то, что есть в Go Tour: массив (в т.ч. слайс), мапа, структура — объяснять не буду.
LIFO (Last In First Out) — если объект вошёл в структуру последним это значит, что он выйдет оттуда первым.
FIFO (First In First Out) — тоже самое самое что и LIFO, но только если объект вошёл в структуру первым, то он тоже выйдет первым.
Стек (LIFO):
Методы:
Push(value) — добавляет элемент в стек
Pop() value — удаляет элемент и возвращает его
Реализация:
Реализуем наш стек с помощью структуры (способов реализации стека куча, но я выберу этот как самый простой).
Наш стек будет принимать целочисленные значения, позже сделаем, чтобы принимал что угодно либо определенный тип, который захочет пользователь.
Вызываем всё таким образом:
Разберём основные структуры данных в Go и реализуем их, а также порешаем задачки
Всё то, что есть в Go Tour: массив (в т.ч. слайс), мапа, структура — объяснять не буду.
LIFO (Last In First Out) — если объект вошёл в структуру последним это значит, что он выйдет оттуда первым.
FIFO (First In First Out) — тоже самое самое что и LIFO, но только если объект вошёл в структуру первым, то он тоже выйдет первым.
Стек (LIFO):
Методы:
Push(value) — добавляет элемент в стек
Pop() value — удаляет элемент и возвращает его
Реализация:
Реализуем наш стек с помощью структуры (способов реализации стека куча, но я выберу этот как самый простой).
Наш стек будет принимать целочисленные значения, позже сделаем, чтобы принимал что угодно либо определенный тип, который захочет пользователь.
//Stack наш стек
type Stack struct {
//Items элементы в нём
Items []int
}
//Push функция добавляет элементы в стек
func (s *Stack) Push(value int) {
//добавляем аргумент из функции в конец массива
s.Items = append(s.Items, value)
}
//Pop возвращает последний вставленный элемент из стека и удаляет его
func (s *Stack) Pop() int {
//Проверка на пустоту (иначе будет out of bounds)
if s.IsEmpty() {
return 0
}
value := s.Items[len(s.Items)-1] //Получаем последний элемент стека
s.Items = s.Items[:len(s.Items)-1] //Удаляем его
return value //Возвращаем этот элемент
}
func (s *Stack) IsEmpty() bool {
//Если в стеке нет элементов, то выражение ниже вернет true
return len(s.Items) == 0
}
Очередь: type Queue struct {
Items []int
}
func (q *Queue) Enqueue(value int) {
q.Items = append(q.Items, value)
}
func (q *Queue) Dequeue() int {
value := q.Items[0]
q.Items = q.Items[1:]
return value
}
func (q *Queue) IsEmpty() bool {
return len(q.Items) == 0
}
В этом подходе мы добавляем элементы в конец массива как обычно, но берем и удаляем первый элементВызываем всё таким образом:
func main() {
s := Queue{}
s.Enqueue(10)
s.Enqueue(20)
s.Enqueue(30)
fmt.Println(s)
s.Dequeue()
fmt.Println(s)
}
Вывод:{[10 20 30]}
{[20 30]}🔥1
Архитектура в Go
В этом посте мы разберёмся почему я просил создать директорию типа
Хорошая архитектура это прежде всего выгодная архитектура, делающая процесс разработки и сопровождения программы более простым и эффективным. Программу с хорошей архитектурой легче расширять и изменять, а также тестировать, отлаживать и понимать.
Ссылаясь на стандарт (это неофициальный стандарт, но он очень удобени ему нужно поклоняться) макета проектов — выполняемые приложения должны находиться в этой директории (также посмотрите примеры, там вы увидите крупные проекты, которые следуют этому стандарту). Также присутствует README.md на русском.
В данной статье вы можете ознакомиться с плохой архитектурой и советы по рефакторингу
Просто представьте как тяжело будет добавлять новый функционал в плохой архитектуре, например: весь ваш функционал находится в главном файле main.go или всё в одной директории (искать по папкам гораздо проще)
В этом посте мы разберёмся почему я просил создать директорию типа
cmd/calc/main.go в проектеХорошая архитектура это прежде всего выгодная архитектура, делающая процесс разработки и сопровождения программы более простым и эффективным. Программу с хорошей архитектурой легче расширять и изменять, а также тестировать, отлаживать и понимать.
Ссылаясь на стандарт (это неофициальный стандарт, но он очень удобен
В данной статье вы можете ознакомиться с плохой архитектурой и советы по рефакторингу
Просто представьте как тяжело будет добавлять новый функционал в плохой архитектуре, например: весь ваш функционал находится в главном файле main.go или всё в одной директории (искать по папкам гораздо проще)
Задача для самостоятельного решения / Стек
Условие задачи:
Необходимо написать калькулятор, который бы выполнял математические результаты над последними двумя элементами стека, а полученный результат выводил и записывал в стек
Ввод:
Вводится число
Далее идут
Вывод:
Результат арифметической операции над числами
Пример:
7
2
3
1
*
+
9
-
Вывод:
3
5
-4
Так как 3*1=3, 2+3=5 и 5-9=-4
Решение будет опубликовано позжену или решено в шараге
Условие задачи:
Необходимо написать калькулятор, который бы выполнял математические результаты над последними двумя элементами стека, а полученный результат выводил и записывал в стек
Ввод:
Вводится число
n, которое представляет количество элементовДалее идут
n элементов через строку, где значение может быть числом либо арифметической операциейВывод:
Результат арифметической операции над числами
Пример:
7
2
3
1
*
+
9
-
Вывод:
3
5
-4
Так как 3*1=3, 2+3=5 и 5-9=-4
Решение будет опубликовано позже
Задача для самостоятельного решения / Стек и очередь
Вася решил приготовить бутерброд, но заглянув в холодильник он обнаружил, что у него нет необходимых ингредиентов. И тогда, разозлившись на весь мир он собрал всю свою волю в кулак и... пошёл в Пятёрочку. Но вот незадача, Пятёрочка, которая раньше стояла напротив его дома — исчезла. Вася в недоумении и не знает что делать... В надежде на помощь он обращается к тебе, как самому лучшему программисту, который способен слепить Пятёрочку из говна и палок.
Задание:
Создать магазин, в котором будут товары и возможность пойти на кассу (встать в очередь)
Бонус-поинты:
Симуляция обработки покупателя (просто рандомная задержка), реализация баланса у человека, реализация хотелок покупателя (т.е. что он хочет купить), возможность выйти из очереди, завоз товаров по таймеру, управление поставками.
Что необходимо реализовать?
Необходимо создать структуру покупателя Customer с полями Name типа string, InHands структуру Shop с полями Name типа string, Queue(очередь) типа Queue, InStock(в наличии) типа []Stock и саму структуру Stock с полями Name типа string и Price типа float64, где Shop — наша Пятёрочка и Stock — товар.
В очереди будет массив из товаров — []Stock.
Если в наличии есть нужный для Васи товар, то мы возьмём его с собой. Если у Васи всё будет, то он пройдет на кассу и купит товар.
Сделаем также дополнительные команды, которые будут добавлять в магазин товары.
Вася решил приготовить бутерброд, но заглянув в холодильник он обнаружил, что у него нет необходимых ингредиентов. И тогда, разозлившись на весь мир он собрал всю свою волю в кулак и... пошёл в Пятёрочку. Но вот незадача, Пятёрочка, которая раньше стояла напротив его дома — исчезла. Вася в недоумении и не знает что делать... В надежде на помощь он обращается к тебе, как самому лучшему программисту, который способен слепить Пятёрочку из говна и палок.
Задание:
Создать магазин, в котором будут товары и возможность пойти на кассу (встать в очередь)
Бонус-поинты:
Симуляция обработки покупателя (просто рандомная задержка), реализация баланса у человека, реализация хотелок покупателя (т.е. что он хочет купить), возможность выйти из очереди, завоз товаров по таймеру, управление поставками.
Что необходимо реализовать?
Необходимо создать структуру покупателя Customer с полями Name типа string, InHands структуру Shop с полями Name типа string, Queue(очередь) типа Queue, InStock(в наличии) типа []Stock и саму структуру Stock с полями Name типа string и Price типа float64, где Shop — наша Пятёрочка и Stock — товар.
В очереди будет массив из товаров — []Stock.
Если в наличии есть нужный для Васи товар, то мы возьмём его с собой. Если у Васи всё будет, то он пройдет на кассу и купит товар.
Сделаем также дополнительные команды, которые будут добавлять в магазин товары.
Как пользоваться Copilot?
GitHub Copilot — инструмент с использованием искусственного интеллекта, совместно разработанный GitHub и OpenAI для помощи пользователям таких интегрированных сред разработки как Visual Studio Code, Visual Studio, Neovim и JetBrains в автодополнении кода.
Для начала необходимо установить плагин Copilot в вашей IDE, в моем случае это Goland. (скриншот 1)
После установки плагина вам предложат авторизоваться, следуя инструкции.
Чтобы дать задачу копайлоту пишите четкий комментарий где хотите дополнить код.
Я хочу сделать простой HTTP сервер, который будет слушать порт 8080 и комментарий будет выглядеть как на скриншоте 2. Далее переходим в функцию и видим, что копайлот предложил реализацию комментария. При нажатии на Таб код вставится. Копайлот не очень умный и иногда советует нерабочий код и то, что ты не просил (нет handler и я не просил хэндлить /, скриншот 4), но это легко исправить, если ты умеешь писать на Го вне. Также можно перемещаться по предложениям копайлота с помощью Alt+], Alt+[, но для меня нет других предложений, поэтому в другой раз.
GitHub Copilot — инструмент с использованием искусственного интеллекта, совместно разработанный GitHub и OpenAI для помощи пользователям таких интегрированных сред разработки как Visual Studio Code, Visual Studio, Neovim и JetBrains в автодополнении кода.
Для начала необходимо установить плагин Copilot в вашей IDE, в моем случае это Goland. (скриншот 1)
После установки плагина вам предложат авторизоваться, следуя инструкции.
Чтобы дать задачу копайлоту пишите четкий комментарий где хотите дополнить код.
Я хочу сделать простой HTTP сервер, который будет слушать порт 8080 и комментарий будет выглядеть как на скриншоте 2. Далее переходим в функцию и видим, что копайлот предложил реализацию комментария. При нажатии на Таб код вставится. Копайлот не очень умный и иногда советует нерабочий код и то, что ты не просил (нет handler и я не просил хэндлить /, скриншот 4), но это легко исправить, если ты умеешь писать на Го вне. Также можно перемещаться по предложениям копайлота с помощью Alt+], Alt+[, но для меня нет других предложений, поэтому в другой раз.
Подробный разбор стандартных пакетов в Go //
В этом посте разберём какие стандартные пакеты существуют в Go и для чего они нужны.
В основном для решения задач могут понадобиться: fmt, bufio, flag, fmt, encoding, io, math, regexp, reflect, sort, unicode, time, strings, strconv.
archive — по названию понятно, что данный пакет связан с архивами. Внутри находятся два пакета tar и zip. Используют его для работы с архивами(шок!): открытие, создание, запись, удаление и т.д. Также с помощью пакета zip можно открыть APK-файл.
bufio — пакет для работы с буферизированным I/O. Для задач может пригодиться Scanner, который построчно сканирует объект, имплементирующий io.Reader (например: *os.File, полученный после os.Open или os.Create).
builtin — пакет для работы с встроенными функциями типа append, cap, len и т.д. Импортировать этот пакет не нужно, так как он уже встроен в программу.
bytes — для работы с байтами. Содержит такие функции как: сравнение двух слайсов байт, содержит ли слайс определенную последовательность и т.д.
compress — для работы со сжатием. Используют вместе с пакетом archive, но также можно использовать для веб разработки.
container — содержит реализацию некоторых структур данных таких как куча, связный список и круг.
context — контексты. Разберём позже.
crypto — пакет для работы с криптографией. Содержит реализацию SHA, AES, MD5. Также содержит пакет rand, который следует использовать для 100% гарантии рандома. Полезное: Is MD5 considered insecure?
database — для работы с БД. Содержит пакет sql, который предоставляет возможность делать SQL запросы и отправлять их серверу. Для подключения к серверу требуются специальные для этого драйвера. Чтобы написать свой драйвер необходимо реализовать интерфейсы, которые находятся в пакете driver.
debug, которым почти никто не пользуется.
embed — отличная вещь, которая появилась в Go 1.16. Позволяет внедрять файлы в бинарник программы. Полезное: Разбираем go:embed в Go 1.16.
encoding — пакет для работы с кодированием. Содержит реализацию XML, CSV, JSON, Base32, Base64 и т.д.
errors — ошибочки. Позволяет создать или сравнить ошибку. Полезное: Работа с ошибками в Go 1.13.
expvar. Пакет expvar в Golang
flag — возможность установить флаги для программы и спарсить их. Полезное: Флаги командной строки (Command-Line Flags).
fmt — пакет для форматированного I/O. Можно сканировать, форматировать I/O.
go — внутренности Go, потом допишу
hash — пакет для работы с хэшированием.
html — пакет содержит функции EscapeString и UnescapeString, также содержит пакет template, который сгенерирует безопасный HTML по шаблону. Полезное: Примеры атак XSS и способов их ослабления, Templates - Go Web Examples.
image — работа с изображениями, поддерживает PNG, JPEG, GIF.
io — работа с I/O.
log — для работы с логами.
math — математические выражения.
mime — реализация MIME.
net — работа с сетью. Включает в себя реализацию различных сетевых протоколов таких как: TCP, UPD, RPC, SMTP, HTML, JSONRPC и всё, что связано с сетью.
os — работа с ОС. Создание папок, выполнение команд и т.д.
path — работа с путями, содержит функции и пакет filepath. File Paths - Go by Example
reflect — рантайм работа с объектами в Go. Полезное: Reflection in Go: Use cases and tutorial - LogRocket Blog
regexp — пакет для работы с регулярными выражениями.
runtime — пакет для работы с рантаймом в Go и с горутинами.
sort — пакет для сортировки. Сортирует слайсы, также есть бинарный поиск Search
strconv — конвертирование строк и наоборот.
strings — работа со строками.
sync — реализация примитив синхронизаций: mutex, cond. Полезное: A Closer Look at Go's sync Package - Teiva Harsanyi - Medium
syscall — системные вызовы, обращение к low-level.
testing — всё для тестирования.
time — работа с временем: форматирование, получение минут, секунд и т.п., сложение дней. Получение Unix Timestamp, парсинг Unix Timestamp'а.
unicode — работа с Unicode. Является ли руна числом, буквой и т.д.
В этом посте разберём какие стандартные пакеты существуют в Go и для чего они нужны.
В основном для решения задач могут понадобиться: fmt, bufio, flag, fmt, encoding, io, math, regexp, reflect, sort, unicode, time, strings, strconv.
archive — по названию понятно, что данный пакет связан с архивами. Внутри находятся два пакета tar и zip. Используют его для работы с архивами
bufio — пакет для работы с буферизированным I/O. Для задач может пригодиться Scanner, который построчно сканирует объект, имплементирующий io.Reader (например: *os.File, полученный после os.Open или os.Create).
builtin — пакет для работы с встроенными функциями типа append, cap, len и т.д. Импортировать этот пакет не нужно, так как он уже встроен в программу.
bytes — для работы с байтами. Содержит такие функции как: сравнение двух слайсов байт, содержит ли слайс определенную последовательность и т.д.
compress — для работы со сжатием. Используют вместе с пакетом archive, но также можно использовать для веб разработки.
container — содержит реализацию некоторых структур данных таких как куча, связный список и круг.
context — контексты. Разберём позже.
crypto — пакет для работы с криптографией. Содержит реализацию SHA, AES, MD5. Также содержит пакет rand, который следует использовать для 100% гарантии рандома. Полезное: Is MD5 considered insecure?
database — для работы с БД. Содержит пакет sql, который предоставляет возможность делать SQL запросы и отправлять их серверу. Для подключения к серверу требуются специальные для этого драйвера. Чтобы написать свой драйвер необходимо реализовать интерфейсы, которые находятся в пакете driver.
debug, которым почти никто не пользуется.
embed — отличная вещь, которая появилась в Go 1.16. Позволяет внедрять файлы в бинарник программы. Полезное: Разбираем go:embed в Go 1.16.
encoding — пакет для работы с кодированием. Содержит реализацию XML, CSV, JSON, Base32, Base64 и т.д.
errors — ошибочки. Позволяет создать или сравнить ошибку. Полезное: Работа с ошибками в Go 1.13.
expvar. Пакет expvar в Golang
flag — возможность установить флаги для программы и спарсить их. Полезное: Флаги командной строки (Command-Line Flags).
fmt — пакет для форматированного I/O. Можно сканировать, форматировать I/O.
go — внутренности Go, потом допишу
hash — пакет для работы с хэшированием.
html — пакет содержит функции EscapeString и UnescapeString, также содержит пакет template, который сгенерирует безопасный HTML по шаблону. Полезное: Примеры атак XSS и способов их ослабления, Templates - Go Web Examples.
image — работа с изображениями, поддерживает PNG, JPEG, GIF.
io — работа с I/O.
log — для работы с логами.
math — математические выражения.
mime — реализация MIME.
net — работа с сетью. Включает в себя реализацию различных сетевых протоколов таких как: TCP, UPD, RPC, SMTP, HTML, JSONRPC и всё, что связано с сетью.
os — работа с ОС. Создание папок, выполнение команд и т.д.
path — работа с путями, содержит функции и пакет filepath. File Paths - Go by Example
reflect — рантайм работа с объектами в Go. Полезное: Reflection in Go: Use cases and tutorial - LogRocket Blog
regexp — пакет для работы с регулярными выражениями.
runtime — пакет для работы с рантаймом в Go и с горутинами.
sort — пакет для сортировки. Сортирует слайсы, также есть бинарный поиск Search
strconv — конвертирование строк и наоборот.
strings — работа со строками.
sync — реализация примитив синхронизаций: mutex, cond. Полезное: A Closer Look at Go's sync Package - Teiva Harsanyi - Medium
syscall — системные вызовы, обращение к low-level.
testing — всё для тестирования.
time — работа с временем: форматирование, получение минут, секунд и т.п., сложение дней. Получение Unix Timestamp, парсинг Unix Timestamp'а.
unicode — работа с Unicode. Является ли руна числом, буквой и т.д.
unsafe — небезопасные функции, обычно используется вместе с syscall. Не рекомендуется использовать без необходимости.
... называется функция?
...ие функции есть в пакете?
... пишутся аргументы для функции?
В этом посту мы разберём как найти документацию для необходимой вам функции даже если у вас нет интернета.
Если вы знаете, какой пакет вам нужен, то просто напишите в командной строке или терминале:
Можно также написать
А если не знаете, то тут два способа:
Для стандартных пакетов: найти папку GOROOT/src, где будут лежать все стандартные пакеты и по этим пакетам попытайтесь угадать где находится нужная вам функция. Чтобы найти GOROOT, пропишите следующее в вашем терминале или командной строке:
Вывод на скриншоте 2 говорит, что GOROOT у меня находится в
Для внешних пакетов: внешние пакеты находятся в GOPATH/pkg/mod и судя по скриншоту 2 GOPATH в моей системе в
Чтобы посмотреть документацию перейдите в нужную папку и также пропишите
Для подробной информации про go doc пропишите
...ие функции есть в пакете?
... пишутся аргументы для функции?
В этом посту мы разберём как найти документацию для необходимой вам функции даже если у вас нет интернета.
Если вы знаете, какой пакет вам нужен, то просто напишите в командной строке или терминале:
go doc <PACKAGE_NAME>, где <PACKAGE_NAME> название пакета. Например: go doc math/rand выдаст следующее (см. скриншот 1).Можно также написать
go doc в самом пакете.А если не знаете, то тут два способа:
Для стандартных пакетов: найти папку GOROOT/src, где будут лежать все стандартные пакеты и по этим пакетам попытайтесь угадать где находится нужная вам функция. Чтобы найти GOROOT, пропишите следующее в вашем терминале или командной строке:
go envВывод на скриншоте 2 говорит, что GOROOT у меня находится в
C:\Program Files\Go следовательно все стандартные пакеты находятся в C:\Program Files\Go\srcДля внешних пакетов: внешние пакеты находятся в GOPATH/pkg/mod и судя по скриншоту 2 GOPATH в моей системе в
C:\Users\hm\goЧтобы посмотреть документацию перейдите в нужную папку и также пропишите
go docДля подробной информации про go doc пропишите
go help docоткуда столько просмотров вы кто люди я этот канал по приколу создал
👍1