После прочтения данного урока вы сможете:
- Заставить компьютер сделать выбор с помощью
if
иswitch
; - Повторить код с помощью цикла
for
; - Использовать условия для цикла и перехода.
Компьютерные программы редко читаются от начала до конца наподобие романа. Они больше похожи на интерактивные истории, где можно выбрать свой собственный путь развития событий. При заданных условиях код выбирает различные варианты работы или повторяет предыдущие шаги, пока не столкнется с заданным условием.
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
Содержание статьи
- True или False — логический тип данных в Go
- Операторы сравнения в Golang
- Условный оператор if-else в Golang
- Логические операторы || и && в Golang
- Оператор switch в Golang
- Цикл for в Golang
Если вы уже знакомы с ключевыми словами if
, else
и for
, что используются во многих других языках программирования, вы сможете быстрее вникнуть в синтаксис Go.
Представьте следующую ситуацию. Чтобы скоротать время во время длительной поездки, члены некой семьи решают сыграть в «Двадцать Вопросов». Один человек должен что-то задумать, а остальным требуется отгадать, что именно. Ведущий может отвечать только «да» или «нет». Вопросы вроде «Насколько он большой?» задавать нельзя. Вместо этого можно спросить «Этот предмет больше тостера?»
Компьютерная программа оперирует по принципу вопросов, ответами на которые может быть «да» или «нет». При наличии условия (к примеру, больше тостера), процессор может продолжить работу или переключиться на другой путь развития событий. Комплексные решения требуется разбивать на более мелкие, простые условия.
Подумайте об одежде, в которую вы сегодня одеты. Как был выбран каждый предмет? Какие переменные рассматривались во время выбора? Погода, планы на день, доступность, мода или что-то другое? Как бы вы научили компьютер одеваться? Для практики можете составить несколько вопросов, вариантами ответа на которые могут быть только «да» или «нет».
True или False — логический тип данных в Go
В настольных играх всегда нужно делать определенный выбор. К примеру, игроку выпадает карта с текстом вроде: «Если хотите выйти из пещеры, перейдите на страницу 21 инструкции для дальнейших указаний». Вы хотите выйти из пещеры? В Go ответом может быть true
или false
, две константы, которые уже объявлены. Их можно использовать следующим образом:
1 2 3 |
var walkOutside = true var takeTheBluePill = false |
В некоторых языках программирования понятие истины несколько расплывчато. В Python и JavaScript отсутствие текста (""
) считается ложью (false
), как и число ноль. В Ruby и Elixir одинаковые значения считаются истиной. В Go единственным истинным значением является true
, а единственным ложным — false
.
true
и false
являются булевыми значениями, названными в честь математика Джорджа Буля, жившего в 19 веке. Несколько функций стандартной библиотеки булево, или логическое значение. К примеру, в следующей программе используется функция Contains
из пакета strings
. С ее помощью код проверяет, содержит ли переменная command
текст «наружу». Если в тексте действительно есть это слово, результатом будет true
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package main import ( "fmt" "strings" ) func main() { fmt.Println("Вы находитесь в темной пещере.") var command = "выйти наружу" var exit = strings.Contains(command, "наружу") fmt.Println("Вы покидаете пещеру:", exit) // Выводит: Вы покидаете пещеру: true } |
Вопросы для проверки:
- Представьте, что на выходе из темной пещеры яркие лучи полуденного солнца заставляют вас зажмуриться. Как бы вы объявили булеву переменную под названием
wearShades
? На английском слово «shades» может использоваться в значении «солнечные очки». - Возле входа в пещеру находится знак. Как можно проверить, содержит ли переменная
command
слово «прочитать»?
Операторы сравнения в Golang
Добиться значений true или false можно через сравнение двух значений. Операторы сравнения в Go представлены в следующей таблице:
Оператор сравнения | Назначение |
== | Равно |
< | Менее чем |
<= | Менее чем или равно |
!= | Не равно |
> | Более чем |
>= | Более чем или равно |
Операторы сравнения используются как с числами, так и с текстом. Это показано в следующем примере:
1 2 3 4 5 6 |
fmt.Println("На знаке снаружи написано 'Несовершеннолетним вход запрещен'.") var age = 41 var adult = age >= 18 fmt.Printf("В возрасте %v, я совершеннолетний? %v\n", age, adult) |
Результат вывода:
1 2 |
На знаке снаружи написано 'Несовершеннолетним вход запрещен'. В возрасте 41, я совершеннолетний? true |
На заметку: В JavaScript и PHP есть специальные тройные операторы для строгого равенства. В этих языках «1» == 1 истинно (неточно), но «1» === 1 ложно (строго). В Go только один оператор равенства, через который нельзя сравнивать текст и число. Тем не менее, можно конвертировать число в текст и наоборот.
Вопрос для проверки:
Что больше — «яблоко» или «банан»?
Условный оператор if-else в Golang
Компьютер может использовать булевы значения или сравнения для выбора между двумя различными вариантами через оператор if
, как показано в следующей программе:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package main import "fmt" func main() { var command = "идти на восток" if command == "идти на восток" { // если command равен "идти на восток" fmt.Println("Вы направляетесь к горе.") } else if command == "зайти внутрь" { // в противном случае, если command равен "зайти внутрь" fmt.Println("Вы заходите в пещеру, где будете жить до конца своей жизни.") } else { // или что-то другое fmt.Println("Пока не совсем понятно.") } } |
Результат вывода:
1 |
You head further up the mountain. |
else if
и else
являются опциональными. Когда рассматривается несколько вариантов, можно повторять else if
столько раз, сколько требуется.
На заметку: Если Go выдает ошибку об использовании знака присваивания (=), значит, в данном случае требуется знак равенства (==).
Вопрос для проверки:
В рассматриваемой приключенческой игре есть несколько локаций. Напишите программу, которая использует if
и else if
для отображения описания каждой из трех локаций: пещеры, входа и горы. При написании программы следите, чтобы фигурные скобки {}
стояли в соответствии с правилами единственного правильного скобочного стиля.
Логические операторы || и && в Golang
В Go логический оператор ||
значит или (OR)
, а &&
значит и (AND)
. Попробуйте использовать логические операторы для проверки нескольких условий за один раз. Внизу даны таблицы, что показывают, как данные операторы работают.
Истинно, если хотя бы один элемент является истиной — a || b
(или):
Истинно, если оба элемента истинны — a && b
(и):
Напишем код, что должен определить, будет ли 2100 год високосным. Правила определения високосного года таковы:
- Любой год, что делится без остатка на четыре, но не делится без остатка на 100;
- Или любой год, что делится без остатка на 400.
Напомним, что для получения остатка деления двух чисел используется оператор %
. Ноль в результате является показателем того, что первое число делится без остатка на второе.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package main import ( "fmt" ) func main() { fmt.Println("На дворе 2100 год. Он високосный?") var year = 2100 var leap = year%400 == 0 || (year%4 == 0 && year%100 != 0) if leap { fmt.Println("Этот год високосный!") } else { fmt.Println("К сожалению, нет. Этот год не високосный.") } } |
Результат вывода программы:
1 2 |
На дворе 2100 год. Он високосный? К сожалению, нет. Этот год не високосный. |
Как и большая часть языков программирования, Go использует логику короткого замыкания. Если первое условие истинно (год делится на 400 без остатка), тогда нет нужды проверять условие, что следует за оператором ||
, поэтому оно будет игнорироваться.
Оператор &&
действует прямо противоположно. Если оба условия не выполняются, тогда результат будет ложен. Если рассматриваемый год не делится без остатка на 4, тогда нет нужды проверять следующее условие.
Не логический оператор !
конвертирует булево значение с false
к true
или наоборот. Если у игрока нет факела, или если факел не горит, следующий код выведет сообщение.
1 2 3 4 5 6 |
var haveTorch = true var litTorch = false if !haveTorch || !litTorch { fmt.Println("Ничего не видно.") // Вывод: Ничего не видно. } |
Вопросы для проверки:
- Взяв за основу рассмотренные в уроке примеры, выясните, был ли 2000 год високосным. Используйте простую ручку, бумагу и в случае необходимости калькулятор. Найдите все остатки, какие операторы для этого используются? После этого приведите условия
==
и!=
кtrue
илиfalse
. Под конец задействуйте логические операторы&&
и||
. Каков результат, был ли 2000 год високосным? - Помогло бы использование логики короткого замыкания сэкономить время при определения истинности выражения
2000%400 == 0
?
Оператор switch в Golang
Для сравнения одного значения с несколькими другими Go использует оператор switch
. Пример его использования показан далее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package main import ( "fmt" ) func main() { fmt.Println("Здесь вход в пещеру и путь на восток.") var command = "зайти внутрь" switch command { // Сравнивает case с command case "идти на восток": fmt.Println("Вы направляетесь к горе.") case "зайти в пещеру", "зайти внутрь": // Запятая разделяет список возможных значений fmt.Println("Вы находитесь в тускло освещенной пещере.") case "прочитать знак": fmt.Println("На знаке написано 'Несовершеннолетним вход запрещен'.") default: fmt.Println("Пока не совсем понятно.") } } |
Результат выполнения программы:
1 2 |
Здесь вход в пещеру и путь на восток. Вы находитесь в тускло освещенной пещере. |
Оператор switch
работает и с числами. Оператор switch
также используется с условиями для каждого конкретного случая наподобие if_else
. Особенностью switch
является ключевое слово fallthrough
, что нужно для выполнения тела следующего case
. Это показано в следующем коде:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package main import ( "fmt" ) func main() { var room = "озеро" switch { // Выражения для каждого случая case room == "пещера": fmt.Println("Вы находитесь в тускло освещенной пещере.") case room == "озеро": fmt.Println("Лед кажется достаточно крепким.") fallthrough // Переходит на следующий случай case room == "глубина": fmt.Println("Вода такая холодная, что сводит кости.") } } |
Результат выполнения программы:
1 2 |
Лед кажется достаточно крепким. Вода такая холодная, что сводит кости. |
Цикл for в Golang
Вместо многочисленного набора одного и того же кода можно использовать ключевое слово for
, что повторяет нужный код за вас. В следующей программе цикл for работает до тех пор, пока count
не станет равен 0.
Перед каждой итерацией выражение count > 0
получает булево значение. Если это false
(count = 0
), цикл прекращается. В противном случае запускается тело цикла (код между {
и }
).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package main import ( "fmt" "time" ) func main() { var count = 10 // Объявление и инициализация for count > 0 { // Условие fmt.Println(count) time.Sleep(time.Second) count-- // Обратный отсчет; в противном случае цикл будет длиться вечно } fmt.Println("Запуск!") } |
В бесконечном цикле условие for
не уточняется, но цикл все еще можно прервать в любое время через break
. В следующем коде какой-то объект движется по окружности 360 градусов и останавливается в случайной точке.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var degrees = 0 for { fmt.Println(degrees) degrees++ if degrees >= 360 { degrees = 0 if rand.Intn(2) == 0 { break } } } |
Обратите внимание, что у цикла for
есть и другие, более сложные формы. В будущем вы обязательно столкнетесь с ними.
Вопрос для проверки:
Не каждый запуск проходит по плану. Реализуйте обратный отсчет, где на каждую секунду приходится шанс 1 к 100, что ввиду определенных обстоятельств запуск прервется, и счетчик остановится.
Заключение
- При указании условия могут использоваться только булевы значения;
- В Go для условий и повторений используются
if
,switch
иfor
; - На данный момент мы рассмотрели 12 из 25 ключевых слов Go:
package
,import
,func
,var
,if
,else
,switch
,case
,default
,fallthrough
,for
иbreak
.
Для проверки собственных сил выполните следующее задание.
Напишите программу для угадывания числа. Заставьте компьютер выбирать случайные числа из промежутка, пока он не угадает задуманное вами число. Данное число нужно заранее объявить в верхней части программы. Пускай на экране отображается каждая догадка с пояснением, больше данное число или меньше задуманного вами варианта.
Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»
Довольно странный ответ на вопрос:
Помогло бы использование логики короткого замыкания сэкономить время при определения истинности выражения
2000%400 == 0
?Да. На решение и запись уравнения уходит значительное количество времени. Компьютеры справляются с этим довольно быстро, а использование логики короткого замыкания может сэкономить время.
В выражении 2000%400 == 0 просто не к чему применить короткое замыкание, ибо мы имеем лишь один оператор сравнения. А в ответе написаны просто общие слова про то, что короткое замыкание действительно улучшает скорость выполнения.
Полезный курс. Я совсем новичок, и мне интересно.
Хочу оставить комментарий по последней задаче для самопроверки. Я непраильно понял задание и написал в итоге нечто намного более интересноне по функционалу.
Кто из новичков захочет поупражняться — сделайте такую программу:
ввод — три числа. Наше загаданне, минимум диапазона и максимум диапазона.
Функционал программы:
выбирает случайное число из заданного диапазона, сравнивает с искомым и на основе этого сравнения сужает область поиска. Так намного проще и быстрее. Поиск числа 3000 в диапазоне от 2000 до 4000 занимает обычно 20-30 итераций.
Вот что должно получиться (результат вывода программы). Красиво)
Я смог