Большинство компьютерных программ представляет собой серию шагов, что можно сравнить с кулинарным рецептом. Если дать компьютеру четкие указания, он сможет выполнить даже самые сложные задачи. Написание инструкций подобного рода называют императивным программированием.
Содержание статьи
- Математические вычисления в Go
- Форматированный вывод Golang — Print, Println, Printf
- Константы и переменные в Go
- Объявление нескольких переменных сразу
- Операторы инкремента и присваивания Go
- Генерация случайного числа в Go
Конечно, компьютеры способны на многое. Но зачем писать целую программу, если можно использовать простой калькулятор? В реальной жизни вам нет нужды запоминать скорость света или время вращения Марса вокруг Солнца. Сохраненный код программы можно прочитать позже. Таким образом, он будет одновременно калькулятором и справочником. Программа является исполняемым документом, который может быть передан и изменен.
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
Далее мы рассмотрим основы Go, изучив его синтаксис на примере создания простого калькулятора. По завершении данного урока вы сможете:
- Создать программу для математических операций;
- Объявлять переменные и константы;
- Разобраться, в чем отличие между объявлением (declaration) и присваиванием (assignment);
- Использовать стандартную библиотеку для генерации псевдослучайных чисел.
Математические вычисления в Go
Многим порой хочется выглядеть моложе и весить чуть меньше. В данном контексте, Марсу есть что предложить. На полный оборот вокруг Солнца Марсу требуется 687 земных дней. Его гравитационная сила также ниже, следовательно, на Марсе все будет весить на 38% меньше, нежели на Земле.
Для вычисления того, насколько помоложе и легче станет человек на Марсе, напишем небольшую программу. В Golang есть те же арифметические операторы, что и в других популярных языках программирования: +, -, *, / и %, что используются для сложения, вычитания, умножения, деления и нахождения модуля соответственно.
На заметку: Оператор модуля
%нужен для получения остатка от деления двух чисел. К примеру, для 42 % 10 результатом будет 2.
Обратите внимание, что выбранная единица измерения веса никак не влияет на сами вычисления. Вы можете рассчитывать вес в килограммах, фунтах и так далее. Вес на Марсе в любом случае будет на 37.83% меньше веса на Земле.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// Программа потери веса на Марсе package main import "fmt" // main является функцией, с которой все начинается func main() { fmt.Print("Мой вес на поверхности Марса равен ") fmt.Print(55.0 * 0.3783) // В результате 20.8065 fmt.Print(" килограммам, а мой возраст равен ") fmt.Print(41 * 365 / 687) // В результате 21 fmt.Print(" годам.") } |
Результат:
|
1 |
Мой вес на поверхности Марса равен 20.8065 килограммам, а мой возраст равен 21 годам. |
Код начинается с комментария. Когда Go видит двойной слеш //, он игнорирует весь текст до конца строки. Программирование строится на коммуникации. Код передает ваши инструкции компьютеру, после чего он трансформирует их и передает другим людям. Комментарии предназначены только для разработчика. Они никак не влияют на ход программы.
В коде функция Print вызывается несколько раз для отображения предложения в одной строке. Также можно передать список аргументов, разделенных запятыми. Аргументом Println может быть текст, число или математическое выражение:
|
1 2 3 |
// Выводит: Мой вес на поверхности Марса равен 20.8065 килограммам, а мой возраст равен 21 годам. fmt.Println("Мой вес на поверхности Марса равен", 55.0 * 0.3783, " килограммам, а а мой возраст равен", 41 * 365 / 687, " годам.") |
Можете поэкспериментировать на Go Playground, заменив вес и возраст, данные в программе, на свои собственные. После редактирования кода нажмите на кнопку Format. Отступы и интервалы в программе автоматически переформатируются без изменения того, что делает код.
Форматированный вывод Golang — Print, Println, Printf
У функций Print и Println есть брат, что дает больше контроля над выводом. Используя Printf, можно вставлять значение в любой части текста.
|
1 2 3 4 5 |
// Выводит: Мой вес на поверхности Марса равен 20.8065 килограммам, fmt.Printf("Мой вес на поверхности Марса равен %v килограммам, ", 55.0 * 0.3783) // Выводит: а мой возраст равен 21 годам. fmt.Printf("а мой возраст равен %v годам.\n", 41 * 365 / 687) |
В отличие от Print и Println, первый аргумент Printf всегда является текстом. После текста следует специальный символ %v, что является заменой значения (сокращенно от value), рассчитанного во втором аргументе.
На заметку: Помимо
%vв Go используются и другие специальные символы. С полным списком можно ознакомиться в официальной документации.
Функция Println автоматически перемещает текст на следующую строку, в то время как Printf и Print этого не делают. При желании переместить что-то на новую строку в тексте нужно добавить \n.
Если уточняется несколько специальных символов, функция Printf подставит значения в следующем порядке:
|
1 2 |
// Выводит: Мой вес на поверхности Земли равен 55 килограммам. fmt.Printf("Мой вес на поверхности %v равен %v килограммам.\n", "Земли", 55) |
В дополнении подставным значениям в предложении Printf позволяет выравнивать текст. Уточнить ширину можно в специальном символе. К примеру, %4v добавит отступ размером в 4 символа. Положительные числа добавляют отступы слева, а отрицательные справа:
|
1 2 |
fmt.Printf("%-15v $%4v\n", "SpaceX", 94) fmt.Printf("%-15v $%4v\n", "Virgin Galactic", 100) |
Результат вывода будет следующим:
|
1 2 |
SpaceX $ 94 Virgin Galactic $ 100 |
Вопросы для проверки:
- Что нужно сделать, чтобы при выводе определенный текст был перенесен на новую строку?
- Что делает
Printfпри добавлении специального символа%v?
Ответы на вопросы
- При необходимости отображения текста на новой строке используется
\nилиfmt.Println(). - Вместо
%vподставляется значением следующих аргументов.
Константы и переменные в Go
Вычисления в предыдущей программе осуществлены над числовыми литералами. Не совсем понятно, что именно означают числа, к примеру значения вроде 0.3783. Иногда программисты говорят о числовых литералах как о магических числах. Константы и переменные могут значительно помочь, предоставив говорящие за себя названия.
Убедившись в преимуществах жизни на Марсе, можно приступить к расчету времени, что потребуется на путешествие. Скорость света была бы идеальной. Такие поездки осуществляются в вакууме на постоянной скорости, что упрощает вычисления. С другой стороны, расстояние от Земли до Марса может значительно отличаться в зависимости от того, в данный конкретный момент времени планеты находятся на солнечной орбите.
В следующей программе представлено два новых ключевых слова, const и var, что нужны для объявления констант и переменных соответственно:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Сколько времени нужно для путешествия на Марс? package main import "fmt" func main() { const lightSpeed = 299792 // км/с var distance = 56000000 // км fmt.Println(distance/lightSpeed, "секунд") // В результате 186 секунд distance = 401000000 fmt.Println(distance/lightSpeed, "секунд") // В результате 1337 секунд } |
Проверьте работоспособность кода на Go Playground, нажав для запуска кнопку Run. Скорость света и правда удобна. Никто не успеет спросить: «Когда мы будем на месте?»
Первое вычисление основывается на том, что Марс и Земля находятся рядом. Объявляется переменная distance, которой присваивается значение в 56,000,000 км. Затем переменной distance присваивается новое значение в 401,000,000 км, что является расстоянием между планетами в тот момент, когда они находятся на противоположных концах солнечной орбиты. Хотя, в реальной жизни пролететь сквозь Солнце вряд ли получится.
На заметку: Константу
lightSpeedизменить нельзя. При попытке присвоить ей новое значение компилятор Go выдаст ошибку"cannot assign to lightSpeed".
Переменные должны быть объявлены перед их использованием. Golang выведет ошибку при попытке присвоить значение переменной, которая не была объявлена через var. К примеру, speed = 16. Это ограничение помогает избежать ошибок случайного присваивания значений не тем переменным. В таком случае сразу можно заметить опечатки вроде случайно введенного distence вместо distance.
Вопросы для проверки:
- Межпланетной Транспортной Системе SpaceX явно не хватает варп-двигателя, но он может добраться до Марса на скорости 100 800 км/ч. Поездка запланирована на Январь 2025 года. Расстояние между Марсом и Землей в это время будет равно 96 300 000 км. За сколько дней астронавты долетят до Марса?
- Продолжительность земных суток равна 24 часам. При написании программы дайте данным 24 часам понятное название, какое ключевое слово вы используете?
Ответы на вопросы
- Конечно, космические корабли не передвигаются по строгой прямой, но в теории полет подобного рода занял бы 39 дней.
123456const hoursPerDay = 24var speed = 100800// км/чvar distance = 96300000 // кмfmt.Println(distance/speed/hoursPerDay, "дней") - В данном случае нужно использовать ключевое слово
const, так как по ходу программы это значение не меняется.
Объявление нескольких переменных сразу
Объявление переменной или константы в Go осуществляется следующим образом:
|
1 2 |
var distance = 56000000 var speed = 100800 |
Переменные или константы также можно объявить группой:
|
1 2 3 4 |
var ( distance = 56000000 speed = 100800 ) |
Объявление нескольких переменных в одну строку:
|
1 |
var distance, speed = 56000000, 100800 |
Перед объявлением нескольких переменных как группы или в одну строку, посмотрите, связаны ли рассматриваемые переменные. И всегда помните, что код должен быть понятным и читабельным.
Вопрос для проверки:
Как одной строкой кода объявить количество часов в сутках и число минут в часе?
Ответ на вопрос
|
1 |
const hoursPerDay, minutesPerHour = 24, 60 |
Операторы инкремента и присваивания Go
Есть несколько коротких способов присваивания с другими операциями. Последние две строки следующего кода равнозначны.
|
1 2 3 |
var weight = 149.0 weight = weight * 0.3783 weight *= 0.3783 |
У оператора инкремента, или увеличения на один есть сокращенный вариант записи, как показано в следующем коде:
|
1 2 3 4 |
var age = 41 age = age + 1 // С днем рождения! age += 1 age++ |
Уменьшить значение можно через count-- или сокращенные варианты других операторов вроде price /= 2 таким же образом.
На заметку: Go не поддерживает префикс инкремента
++count, как это делают С или Java.
Вопрос для проверки:
Напишите кратчайшую строку кода для вычитания двух фунтов из переменной под названием weight.
Ответ на вопрос
|
1 |
weight -= 2 |
Генерация случайного числа в Go
Загадайте любое число между 1 и 10.
Готово? Окей.
Компьютер также можно «заставить» загадать любое число между 1 и 10. Для генерации псевдослучайного числа в Go используется пакет rand. Числа называются псевдослучайными, так как они более или менее случайные, но не совсем.
Следующая программа отображает два числа в диапазоне 1-10. При передаче 10 к Intn возвращается число в промежутке 0-9, куда добавляется 1 и результат присваивается к num. Переменная num не может быть константой Go, так как это результат вызова функции.
На заметку: При рассмотрении промежутка 1-10 обязательно нужно добавить единицу. В противном случае будет получено число в диапазоне 0-9. Это типичный пример ошибки неучтенной единицы, классической ошибки программирования.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package main import ( "fmt" "math/rand" ) func main() { var num = rand.Intn(10) + 1 fmt.Println(num) num = rand.Intn(10) + 1 fmt.Println(num) } |
Путем импорта пакета rand является math/rand. У функции Intn есть префикс rand (название пакета), хотя путь импорта длиннее.
На заметку: При каждом запуске программы для получения двух псевдослучайных чисел на Go Playground будут отображаться одни и те же варианты. Так и надо, все подстроено. На сайте Go Playground время останавливается и результат кешируется, однако этих чисел нам пока хватит.
Для использования пакета нужно, чтобы он значился в import. Go Playground добавляет пути импорта автоматически. Сначала нужно поставить галочку возле чекбокса Imports, а затем нажать на кнопку Format. Go Playground определит, какие пакеты используются, и обновит пути импорта.
Вопрос для проверки:
Расстояние между Землей и Марсом в разное время отличается и зависит от того, где планеты в данный конкретный момент времени находятся на орбите Солнца. Напишите программу для генерации случайного расстояния в промежутке от 56 000 000 до 401 000 000 км.
Ответ на вопрос
|
1 2 3 |
// случайное расстояние до Марса (км) var distance = rand.Intn(345000001) + 56000000 fmt.Println(distance) |
Заключение
- Функции
Print,PrintlnиPrintfвыводят на экран текст и числа; - С помощью
Printfи специального сокращения%vзначения можно вставить в любом месте отображаемого текста; - Константа объявляется через ключевое слово
const, ее изменить нельзя; - Переменная объявляется через ключевое слово
var, ей можно присвоить новое значение во время работы программы; - Пути импорта
math/randотсылаются к пакетуrand; - Функция Intn из пакета rand генерирует псевдослучайные числа;
- В уроке были разобраны 5 из 25 ключевых слов Go:
package,import,func,constиvar.
Для проверки собственных сил выполните следующее задание.
Напишите программу, которая посчитает, как быстро должна передвигаться ракета (км/ч), чтобы добраться до Марса за 28 дней. Предположим, что расстояние от Земли до Марса равно 56 000 000 км.
Выполнив задание, можете сравнить свое решение с нашим вариантом.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
package main import "fmt" func main() { const hoursPerDay = 24 var days = 28 var distance = 56000000 // km fmt.Println(distance/(days*hoursPerDay), "км/ч") } |

Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»
Хороший материал, но не «будет на 37.83% меньше веса на Земле«, а «будет составлять 37.83% веса на Земле«
Than you very much to administration for this the most important information. I wish you will continue this great work.
В килограммах измеряется в масса, вес измеряется в ньютонах. Помню как сейчас, именно за это мне в школе учитель поставил 2 на вопрос сколько я вешу и получив ответ в килограмах 🙂