Большинство компьютерных программ представляет собой серию шагов, что можно сравнить с кулинарным рецептом. Если дать компьютеру четкие указания, он сможет выполнить даже самые сложные задачи. Написание инструкций подобного рода называют императивным программированием.
Содержание статьи
- Математические вычисления в 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
?
Константы и переменные в 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 часам понятное название, какое ключевое слово вы используете?
Объявление нескольких переменных сразу
Объявление переменной или константы в Go осуществляется следующим образом:
1 2 |
var distance = 56000000 var speed = 100800 |
Переменные или константы также можно объявить группой:
1 2 3 4 |
var ( distance = 56000000 speed = 100800 ) |
Объявление нескольких переменных в одну строку:
1 |
var distance, speed = 56000000, 100800 |
Перед объявлением нескольких переменных как группы или в одну строку, посмотрите, связаны ли рассматриваемые переменные. И всегда помните, что код должен быть понятным и читабельным.
Вопрос для проверки:
Как одной строкой кода объявить количество часов в сутках и число минут в часе?
Операторы инкремента и присваивания 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
.
Генерация случайного числа в 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 км.
Заключение
- Функции
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% веса на Земле«