Утверждения "switch" (переключатель) обеспечивают многовариантное исполнение. Спецификатор выражения или типа сравнивается с "cases" (случаи) внутри "switch", чтобы определить, какую ветвь выполнить.
SwitchStmt = ExprSwitchStmt | TypeSwitchStmt .
Существует две формы: переключатели выражения (expression switch) и переключатели типа (type switch). В переключателе выражений случаи содержат выражения, которые сравниваются со значением выражения переключателя. В переключателе типов случаи содержат типы, которые сравниваются с типом специально аннотированного выражения переключателя. Выражение switch вычисляется ровно один раз в операторе switch.
Переключатели выражений (expression switch)
В переключателе выражений switch выражение оценивается, а case выражения, которые не обязательно должны быть константами, оцениваются слева направо и сверху вниз; первое, равное выражению переключателя, запускает выполнение утверждений соответствующего случая; другие case пропускаются. Если ни один case не соответствует и существует "default" case (случай по умолчанию), то выполняются его утверждения. Может быть не более одного случая по умолчанию, и он может появляться где угодно в "switch" утверждении. Отсутствующее выражение переключателя эквивалентно логическому значению true.
ExprSwitchStmt = "switch" [ SimpleStmt ";" ] [ Expression ] "{" { ExprCaseClause } "}" .
ExprCaseClause = ExprSwitchCase ":" StatementList .
ExprSwitchCase = "case" ExpressionList | "default" .
Если выражение switch оценивается как нетипизированная константа, оно сначала неявно преобразуется в тип по умолчанию; если это нетипизированное логическое значение, оно сначала неявно преобразуется в тип bool. Предварительно объявленное нетипизированное значение nil нельзя использовать в качестве выражения переключения.
Если выражение case не типизировано, оно сначала неявно преобразуется в тип выражения switch. Для каждого (возможно преобразованного) выражения case x и значения t выражения-переключателя x == t должно быть допустимым сравнением.
Другими словами, выражение switch обрабатывается так, как если бы оно использовалось для объявления и инициализации временной переменной t без явного типа; это та величина t, с которой каждое выражение x случая проверяется на равенство.
В case или default блоках последнее непустое утверждение может быть (возможно, помечено (labeled)) утверждением "провала" ("fallthrough" statement), чтобы указать, что управление должно перетекать из конца этого пункта в первое утверждение следующего пункта. В противном случае управление переходит к концу утверждения "switch". Утверждение "fallthrough" может появляться как последнее утверждение всего, кроме последнего пункта переключателя выражений.
Выражению-переключателю может предшествовать простое утверждение, которое выполняется до того, как выражение будет оценено.
switch tag {
default: s3()
case 0, 1, 2, 3: s1()
case 4, 5, 6, 7: s2()
}
// пропущенное выражение переключателя означает "true"
switch x := f(); {
case x < 0: return -x
default: return x
}
switch {
case x < y: f1()
case x < z: f2()
case x == 4: f3()
}
Ограничение реализации: компилятор может запретить множественные выражения с одинаковыми константами. Например, текущие компиляторы запрещают дублирующиеся целочисленные, с плавающей точкой или строковые константы в case выражениях.
Читайте также:
Комментариев нет:
Отправить комментарий