ГОЛАНГ
Анатомия условных операторов и циклов в Go
Go предоставляет if/else
и switch
условные операторы для выполнения кода на основе определенных условий. Чтобы выполнять какой-то код снова и снова, у нас есть цикл for
.
Условный оператор if/else
Go предоставляет if
, if-else
, if-else if-else
варианты оператора if / else, с которым мы знакомы. Он используется для проверки условия и выполнения некоторого кода, когда условие равно true
или false
.
Состояние if
Ниже показано простое использование условия if
. В отличие от большинства языков программирования, Go не позволяет заключать condition
в круглые скобки ()
.
В отличие от языка
JavaScript
илиC
,{}
фигурные скобки являются обязательными, даже если между{...}
есть только один оператор.
Состояние if-else
В случае условия if-else
, если условие if
равно false
, он выполнит блок else
.
Здесь следует отметить, что мы написали оператор else
в той же строке конечной скобки }
оператора if
. Это необходимо, потому что, если бы мы написали else
оператор на новой строке, Go поставил бы точку с запятой ;
в конце if
, и программа вызвала бы ошибку.
if condition {
} // implicit ; else {
}
Состояние if-else if-else
Условие else if
используется, когда вы хотите попробовать несколько условий.
Первое if
условие будет оценено, если условие выполнено (оценено как true
), будет выполнен код внутри блока if
, и никакие дальнейшие условия не будут оцениваться.
Но если условие if
не выполнено, следующие условия подряд блоков else if
будут оцениваться до тех пор, пока не будет выполнено одно условие. Если ни одно из условий не выполняется, будет оцениваться else
блок.
Первоначальное заявление
Вы можете выполнить начальную инструкцию до оценки if
условия.
if statement; condition {
...
}
Это может пригодиться для инициализации переменной условия и ограничения области действия этой переменной только блоком if-else
.
Тернарное условие
Go не поддерживает тройные однострочники, и нет четкого идиоматического способа добиться этого.
Условный оператор switch
Оператор Tswitch
обычно используется для замены нескольких условий if-else
.
Синтаксис оператора switch
Оператор switch
принимает одно входное значение и сопоставляется со многими случаями. В отличие от C
, Go не требует оператора break
для завершения блока case
. Блок case
завершится, как только будет выполнен последний оператор в блоке case
, как и оператор switch
. Повторяющиеся случаи (значения) в Go не допускаются.
switch input {
case value_1:
...
case value_1:
...
}
Рассмотрим простой пример поиска имени пальца по указательному пальцу.
В приведенной выше программе мы передаем переменную finger
в качестве входного значения в блок switch
. Затем switch
попытайтесь найти блок case
, который соответствует этому значению. В приведенной выше программе, начиная с finger == 2
, case 2
будет выполняться и записывать сообщение Index
в терминал.
Если значение
finger
не находится в диапазоне от 1 до 5, ничего не печатается.
Дело default
Иногда нам нужно else
условие, когда нам нужно выполнить какой-то фрагмент кода, когда ни один из случаев не соответствует входному значению. В этом случае используется блок default
.
В приведенной выше программе, поскольку входное значение finger
равно 6 и ни один из случаев не соответствует этому значению, будет выполнен блок default
, печатающий No fingers matched
на экране.
Случай
default
не обязательно должен быть последним. Это может быть где угодно вswitch
блоке.
Несколько case
значений
Вы можете указать несколько (,
) значений регистра, разделенных запятыми, чтобы соответствовать входному switch
значению.
Вышеупомянутая программа напечатает Letter is a vovel
, поскольку переменная letter
имеет значение i
, которое принадлежит значениям case "a", "e", "i", "o", "u"
.
Первоначальное заявление
Существует еще один вариант оператора switch
, в котором вы можете добавить начальный оператор перед входным значением, как if
условный оператор.
switch statement; input {
...
}
Давайте посмотрим на предыдущий пример, где в этом случае мы определим переменную letter
в самом выражении switch
, ограничив ее область действия блоком switch
.
Невыразительное switch
заявление
Значение ввода в инструкции Go switch
является необязательным. Если для оператора switch
нет входного значения, case
будет выражением, возвращающим логическое значение.
Поскольку number
больше 20, условие number > 5
будет выполнено, и number is greater than 5
будет выведен на консоль.
Мы можем использовать начальную инструкцию без входного значения инструкции switch
. В приведенной выше программе мы могли инициализировать number
переменную в операторе switch
.
Точка с запятой необходима после начального оператора, потому что, если мы не добавим точку с запятой, тогда наш switch
оператор больше не будет лишен выражения и number := getnumber()
станет выражением входного значения, которое является недопустимым.
Заявление fallthrough
Как обычно, когда выполняется блок case
, другие случаи не рассматриваются. В приведенной выше программе число больше 5, 10 и 15, но поскольку number > 5
и первый case
удовлетворяют этому условию и выполняется только этот блок case
. Чтобы выполнить еще case
блоков, мы используем оператор fallthrough
.
Когда условие case
оценивается и возвращает true
или соответствует входному значению, этот блок case
выполняется. Если компилятор находит оператор fallthrough
, следующий блок case
выполняется без оценки регистра.
fallthrough
должен быть последним оператором в блоке case
, иначе компилятор Go выдаст ошибку fallthrough statement out of place
.
Оператор
fallthrough
не разрешен в последнемcase
блоке, поскольку нет других условий, в которые можно было бы попасть.
for
петли
В отличие от C
и других языков программирования, единственный доступный цикл в Go - это for
цикл. Но многие варианты for
цикла в Go вполне справятся со всеми задачами. Итак, давайте рассмотрим это.
Синтаксис цикла for
Синтаксис цикла for
состоит из трех операторов, и все три оператора в Go необязательны.
for init; condition; post {
...
}
- Оператор
init
инициализирует любые переменные, которые могут потребоваться в операторе проверкиcondition
или оператореpost
. Этот оператор будет вызван один раз, когда начнется выполнениеfor
цикла. - Оператор
condition
проверяет наличие условия. Если условие возвращаетtrue
, тогда будет выполнен код внутри циклаfor
. - В конце выполнения кода будет выполнен оператор
post
. В этом операторе мы можем изменять любые переменные, определенные в оператореinit
. После выполнения оператораpost
операторcondition
будет снова вычислен. Еслиcondition
возвращаетtrue
, код внутри циклаfor
будет выполнен снова, иначе циклfor
завершится.
Начнем с примера.
В приведенной выше программе мы печатаем числа от 1 до 6.
Варианты петли for
Как обсуждалось ранее, все три оператора в цикле for
необязательны.
Необязательный оператор post: мы можем отбросить post
оператор и выполнить внутри for
код цикла, чтобы получить те же результаты.
Необязательный оператор инициализации. Мы также можем удалить оператор init
и выполнить его вне for
цикла. Но в этом случае переменная i
будет доступна вне цикла for
.
Необязательный оператор инициализации и публикации: мы можем работать только с condition
оператором проверки. В этом случае можно отбросить все точки с запятой, Go будет рассматривать этот оператор как condition
оператор. Это похоже на while
цикл на C
языке.
Без всех операторов: поскольку все for
операторы цикла являются необязательными, давайте посмотрим, как это будет работать. Цикл for
без каких-либо операторов - это цикл for
, где оператор condition
всегда истинен, поэтому он будет повторяться бесконечно, если не будет завершен вручную из кода цикла for
.
Приведенный выше код выведет те же результаты, что и любой из предыдущих примеров, но на этот раз нам пришлось использовать оператор break
для завершения цикла, иначе он напечатал бы все возможные числа.
Заявление break
Оператор break
используется внутри цикла for
для завершения цикла for
. Любой код после оператора break
выполняться не будет.
В приведенной выше программе, когда i
больше 6, условие if
будет true
и будет выполняться инструкция break
. Это немедленно завершит цикл for
.
Заявление continue
Оператор continue
используется для пропуска одной итерации цикла for
. Когда цикл for
видит оператор continue
, он просто игнорирует текущую итерацию, выполняет оператор post
и запускается снова. Простым примером может быть печать только четных чисел от 1 до 10.
Заявление return
Если цикл for
встречает оператор return
, выполнение функции будет остановлено, и функция вернет значение. Следовательно, return
не относится к циклу for
.